Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

247
Vistas
Docker Compose no inicia el servicio mongo, incluso el servicio principal depende de ello

Estoy tratando de construir un proceso ci para compilar, probar y publicar mi aplicación .NET Core usando Docker-Compose y bash scripts.

Tengo proyectos UnitTests, IntegrationTests y XApi en una carpeta y he creado DockerFile y docker-compose.yml como se muestra a continuación.

Las pruebas de IntegrationTests dependen de mongointegration , por lo que agregué links y atributos depends_on al servicio testandpublish en docker-compose.yml .

Cuando intento docker-compose up o docker-compose up testandpublish , no se puede conectar mongo. (DockerFile - paso 10), el servicio mongo aún no se ha iniciado (no entiendo por qué)

En el paso 10, si cambio RUN a CMD , puede conectarse a mongo, docker-compose funciona bien. Pero esta vez no puedo detectar que las pruebas fallaron o tuvieron éxito en mi script sh, porque ahora no interrumpe el comando docker-compose up .

Mi pregunta es: ¿Por qué docker compose no inicia el servicio mongointegration ? Y si es imposible, ¿cómo puedo entender que el servicio testandpublish falló? Gracias.

Estructura:

 XProject -src -Tests -UnitTests -IntegrationTests -Dockerfile -docker-compose.yml -XApi

Mi contenido de Dockerfile es (he agregado números de línea para explicar el problema aquí):

 1.FROM microsoft/dotnet:1.1.0-sdk-projectjson 2.COPY . /app 3.WORKDIR /app/src/Tests/UnitTests 4.RUN ["dotnet", "restore"] 5.RUN ["dotnet", "build"] 6.RUN ["dotnet", "test"] 7.WORKDIR /app/src/Tests/IntegrationTests 8.RUN ["dotnet", "restore"] 9.RUN ["dotnet", "build"] 10.RUN ["dotnet", "test"] 11.WORKDIR /app/src/XApi 12.RUN ["dotnet", "restore"] 13.RUN ["dotnet", "build"] 14.CMD ["dotnet", "publish", "-c", "Release", "-o", "publish"]

y mi docker-compose.yml

 version: "3" services: testandpublish: build: . links: - mongointegration depends_on: - mongointegration mongointegration: image: mongo ports: - "27017:27017"
about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

La fase de construcción de la imagen y la fase de ejecución del contenedor son dos pasos muy separados en docker-compose.

Construir y ejecutar diferencias

La fase de construcción crea cada una de las capas de la imagen a partir de los pasos del Dockerfile. Cada uno ocurre en contenedores independientes. Ninguna de las configuraciones de su servicio, aparte de la build: stanza específica para una compilación de servicios, está disponible durante la compilación.

Una vez que se crea la imagen, se puede ejecutar como un contenedor con el resto de la configuración del servicio docker-compose.

En lugar de ejecutar pruebas en su Dockerfile, puede crear una secuencia de comandos para usar como CMD que ejecuta todos sus pasos de prueba en el contenedor.

 #!/bin/sh set -uex cd /app/src/Tests/UnitTests dotnet restore dotnet build dotnet test cd /app/src/Tests/IntegrationTests dotnet restore dotnet build dotnet test" cd /app/src/XApi dotnet restore dotnet build dotnet publish -c Release -o publish

Si la imagen microsoft/dotnet:1.1.0-sdk-projectjson está basada en Windows, es posible que deba convertirla a los comandos CMD o PS equivalentes.

Dependencias de contenedores

depends_on no funciona tan bien como la mayoría de la gente supone que lo hará. En su forma simple, depends_on solo espera a que se inicie el contenedor antes de pasar a iniciar el contenedor dependiente. No es lo suficientemente inteligente como para esperar a que el proceso dentro del contenedor esté listo. Las dependencias adecuadas se pueden hacer con un control de healthcheck y una condition .

 services: testandpublish: build: . links: - mongointegration depends_on: mongointegration: condition: service_healthy mongointegration: image: mongo ports: - "27017:27017" healthcheck: test: ["CMD", "docker-healthcheck"] interval: 30s timeout: s retries: 3

Usando el script de verificación de estado de Docker , después de que se haya copiado en el contenedor a través de un Dockerfile.

 #!/bin/bash set -eo pipefail host="$(hostname --ip-address || echo '127.0.0.1')" if mongo --quiet "$host/test" --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'; then exit 0 fi exit 1
about 4 years ago · Santiago Trujillo Denunciar

0

Los pasos RUN se ejecutan cuando Docker crea la imagen y aún no hay contenedores disponibles. En su lugar, el paso de CMD se ejecuta en el tiempo de ejecución y Docker Compose ya ha comenzado dependiendo del contenedor de integración mongo.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda