Tengo el siguiente docker-compose , donde necesito esperar a que el servicio jhipster-Registry esté activo y acepte conexiones antes de iniciar myprogram-app .

Intenté la forma de verificación de salud, siguiendo el documento oficial https: // docs .docker.com / compose / compose-file / compose-file-v2 /

version: '2.1'
services:
    myprogram-app:
        image: myprogram
        mem_limit: 1024m
        environment:
            - SPRING_PROFILES_ACTIVE=prod,swagger
            - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/eureka
            - SPRING_CLOUD_CONFIG_URI=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/config
            - SPRING_DATASOURCE_URL=jdbc:postgresql://myprogram-postgresql:5432/myprogram
            - JHIPSTER_SLEEP=0
            - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=myprogram-elasticsearch:9300
            - JHIPSTER_REGISTRY_PASSWORD=53bqDrurQAthqrXG
            - EMAIL_USERNAME
            - EMAIL_PASSWORD
        ports:
            - 8080:8080
        networks:
          - backend
        depends_on:
          - jhipster-registry:
              "condition": service_started
          - myprogram-postgresql
          - myprogram-elasticsearch
    myprogram-postgresql:
        image: postgres:9.6.5
        mem_limit: 256m
        environment:
            - POSTGRES_USER=myprogram
            - POSTGRES_PASSWORD=myprogram
        networks:
          - backend
    myprogram-elasticsearch:
        image: elasticsearch:2.4.6
        mem_limit: 512m
        networks:
          - backend
    jhipster-registry:
        extends:
            file: jhipster-registry.yml
            service: jhipster-registry
        mem_limit: 512m
        ports:
            - 8761:8761
        networks:
          - backend
        healthcheck:
          test: "exit 0"
networks:
  backend:
    driver: "bridge"

Pero aparece el siguiente error al ejecutar docker-compose up:

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.myprogram-app.depends_on contains {"jhipster-registry": {"condition": "service_started"}}, which is an invalid type, it should be a string

¿Estoy haciendo algo mal o esta función ya no es compatible? ¿Cómo lograr esta sincronización entre servicios?

Versión actualizada

version: '2.1'
services:
    myprogram-app:
        image: myprogram
        mem_limit: 1024m
        environment:
            - SPRING_PROFILES_ACTIVE=prod,swagger
            - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/eureka
            - SPRING_CLOUD_CONFIG_URI=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/config
            - SPRING_DATASOURCE_URL=jdbc:postgresql://myprogram-postgresql:5432/myprogram
            - JHIPSTER_SLEEP=0
            - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=myprogram-elasticsearch:9300
            - JHIPSTER_REGISTRY_PASSWORD=53bqDrurQAthqrXG
            - EMAIL_USERNAME
            - EMAIL_PASSWORD
        ports:
            - 8080:8080
        networks:
          - backend
        depends_on:
          jhipster-registry:
            condition: service_healthy
          myprogram-postgresql:
            condition: service_started
          myprogram-elasticsearch:
            condition: service_started
        #restart: on-failure
    myprogram-postgresql:
        image: postgres:9.6.5
        mem_limit: 256m
        environment:
            - POSTGRES_USER=myprogram
            - POSTGRES_PASSWORD=tuenemreh
        networks:
          - backend
    myprogram-elasticsearch:
        image: elasticsearch:2.4.6
        mem_limit: 512m
        networks:
          - backend
    jhipster-registry:
        extends:
            file: jhipster-registry.yml
            service: jhipster-registry
        mem_limit: 512m
        ports:
            - 8761:8761
        networks:
          - backend
        healthcheck:
          test: ["CMD", "curl", "-f", "http://jhipster-registry:8761", "|| exit 1"]
          interval: 30s
          retries: 20
          #start_period: 30s
networks:
  backend:
    driver: "bridge"

La versión actualizada me da un error diferente,

ERROR: for myprogram-app  Container "8ebca614590c" is unhealthy.
ERROR: Encountered errors while bringing up the project.

Diciendo que el contenedor de jhipster-Registry no es saludable, pero es accesible a través del navegador. ¿Cómo puedo arreglar el comando en el chequeo de salud para que funcione?

2
1Z10 14 sep. 2018 a las 01:57

3 respuestas

La mejor respuesta

La documentación sugiere que, en Los archivos de Docker Compose versión 2 específicamente , depends_on: pueden ser una lista de cadenas o un mapeo donde las claves son nombres de servicio y los valores son condiciones. Para los servicios en los que no tiene (o no necesita) controles de salud, existe una condición service_started.

depends_on:
  # notice: these lines don't start with "-"
  jhipster-registry:
    condition: service_healthy
  myprogram-postgresql:
    condition: service_started
  myprogram-elasticsearch:
    condition: service_started

Dependiendo de cuánto control tenga sobre su programa y sus bibliotecas, es mejor si puede organizar que el servicio pueda iniciarse sin que sus dependencias estén necesariamente disponibles (de manera equivalente, para funcionar si sus dependencias mueren mientras el servicio se está ejecutando) , y no usar la opción depends_on:. Puede devolver un error HTTP 503 Servicio no disponible si la base de datos está inactiva, por ejemplo. Otra estrategia que a menudo es útil es salir inmediatamente si sus dependencias no están disponibles, pero use una configuración como restart: on-error para pedirle al orquestador que reinicie el servicio.

6
David Maze 16 nov. 2018 a las 03:04

Actualización a la versión 3+.

Siga los documentos de la versión 3:

Hay varias cosas a tener en cuenta al usar depends_on:

depends_on no espera a que db y redis estén "listos" antes inicio web - solo hasta que se hayan iniciado.
Si necesitas esperar para que un servicio esté listo, consulte Control del pedido de inicio para obtener más información sobre Este problema y las estrategias para resolverlo.
La versión 3 ya no admite la forma de condición de depends_on.
La opción depends_on es ignorado al implementar una pila en modo enjambre con una versión 3 Compose archivo.

Consideraría usar la opción restart_policy para configurar su myprogram- para reiniciar hasta que el jhipster-Registry esté activo y acepte conexiones:

 restart_policy:
        condition: on-failure
        delay: 3s
        max_attempts: 5
        window: 60s
0
RtmY 30 abr. 2020 a las 13:00

Aunque ya recibió una respuesta, debe mencionarse que lo que está tratando de lograr tiene algunos riesgos desagradables.

Idealmente, un servicio debería ser autosuficiente e lo suficientemente inteligente como para volver a intentarlo y esperar a que las dependencias estén disponibles (antes de una caída). De lo contrario, estará más expuesto a una falla que se propague a otros servicios. También considere que un reinicio del sistema, a diferencia de un inicio manual, podría ignorar el orden de dependencias.

Si un bloqueo del servicio hace que todo su sistema se caiga, es posible que tenga una herramienta para reiniciar todo nuevamente, pero sería mejor tener servicios que resistan ese caso.

0
SystematicFrank 15 abr. 2019 a las 08:27