Docker-Compose: как ждать, пока другой сервис будет готов? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть следующее docker-compose , где мне нужно дождаться, пока служба jhipster-registry будет запущена и принимает подключения, прежде чем запускать myprogram-app .

Я испробовал способ проверки здоровья, следуя официальному документу 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"

но я получаю следующую ошибку при запуске 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

Я что-то не так делаю, или эта функция больше не поддерживается? Как добиться этой синхронизации между сервисами?

Обновленная версия

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"

Обновленная версия выдает мне другую ошибку,

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

говорит, что контейнер jhipster-registry вреден для здоровья, но доступен через браузер. Как я могу исправить команду в проверке здоровья, чтобы она работала?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Хотя вы уже получили ответ, следует отметить, что то, что вы пытаетесь достичь, сопряжено с некоторыми неприятными рисками.

В идеале служба должна быть самодостаточной и достаточно умной, чтобы повторять попытки и ожидать зависимостидоступно (до спуска).В противном случае вы будете более подвержены одному сбою, распространяющемуся на другие сервисы.Также учтите, что перезагрузка системы, в отличие от ручного запуска, может игнорировать порядок зависимостей.

Если из-за одного сбоя службы происходит сбой всей системы, у вас может быть инструмент для перезапуска всего, но было бы лучшес услугами, которые сопротивляются этому случаю.

0 голосов
/ 14 сентября 2018

Документация предполагает, что в файлах Docker Compose версии 2, в частности , depends_on:, может быть списком строк или отображением, где ключи являются именами служб и значениями. условия. Для услуг, в которых у вас нет (или вам не нужны) проверки здоровья, существует условие 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

В зависимости от того, насколько вы контролируете свою программу и ее библиотеки, все же лучше, если вы сможете организовать запуск службы без необходимости ее зависимостей (эквивалентно, чтобы функционировать, если ее зависимости умирают, пока служба запущен), а не использовать опцию depends_on:. Вы можете вернуть ошибку HTTP 503 Service Unavailable, например, если база данных не работает. Другая стратегия, которая часто бывает полезной, - это немедленное завершение работы, если ваши зависимости недоступны, но используйте параметр , например restart: on-error, чтобы попросить оркестратора перезапустить службу.

...