Estoy tratando de crear docker-compose.yml con MongoDB y Spring boot. El problema es que no quiero codificar ninguna conexión de base de datos en application.properties de Spring.
De este artículo vi que puede iniciar un contenedor mongodb con un nombre de host predefinido. Como entiendo, todos los servicios definidos en el archivo yml de composición están en la misma red pero tienen direcciones IP diferentes, ¿verdad? Entonces, la pregunta principal es cómo definir el nombre de host mongodb en docker-compose.yml y usar ese nombre en el archivo spring boot application.properties.
Intentaré dar toda la información que pueda, pero si algo no está claro, házmelo saber.
Aquí hay información sobre la aplicación Spring Boot.
Las dependencias que estoy usando en el proyecto Spring son:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>La aplicación tiene interfaces que amplían MongoRepository:
import org.springframework.data.mongodb.repository.MongoRepository; public interface ServiceLoggerRepository extends MongoRepository<ExampleEntity, String> { }y está utilizando entidades anotadas de @Document
import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "example") public class ExampleEntity { @Id private String _id; private String name; }La conexión de la base de datos se define en el archivo application.properties:
#here is the problem - this the vm ip spring.data.mongodb.uri=mongodb://192.168.0.51 spring.data.mongodb.database=mongo-testInformación sobre el Dockerfile de Spring Boot:
FROM openjdk:8-jre COPY ./mongo-test.jar ./usr/mongo-test.jar EXPOSE 8080 RUN sh -c 'touch /usr/mongo-test.jar' ENTRYPOINT ["java","-jar","/usr/mongo-test.jar"]Información sobre docker-compose: tiene 2 servicios: MongoDB y la aplicación Spring Boot.
version: "3" services: mongodb: restart: always image: mongo container_name: "mongodb-test" ports: - 27017:27017 command: --smallfiles mongo-logger: restart: always build: ./mongo-test container_name: "mongo-test" ports: - 8080:8080 depends_on: - mongodb links: - mongodb Cuando se crea y ejecuta el contenedor, funciona. Pero el problema es que no tengo idea de dónde y cómo definir spring.data.mongodb.uri para usar algo estático como spring.data.mongodb.uri=mongodb://mongo-hostname por ejemplo.
¿Es posible y hay soluciones rey o buenas prácticas para hacer esto?
Para acceder a mongodb, debe usar el nombre del servicio mongodb definido en docker-compose.yml .
Y puede configurar eso en las propiedades de la aplicación usando env vars como a continuación:
//aplication.properties ... spring.data.mongodb.uri=${MONGODB_URI}y
//docker-compose.yml version: "3" services: mongodb: image: mongo container_name: "mongodb-test" ports: - 27017:27017 mongo-logger: build: ./mongo-test container_name: "mongo-test" ports: - 8080:8080 environment: - MONGODB_URI=mongodb://mongodb depends_on: - mongodb