在Docker中服务如何开始“启动”的顺序-(等待一项服务完全启动,然后再启动另一项)

时间:2019-04-12 09:38:12

标签: docker docker-compose docker-stack

就我的Docker服务的设置方式而言,我遇到了问题。实际上,我有五个服务:api(一个Django Rest Framework应用程序),db(一个PostgreSQL数据库),elasticsearch(一个Elasticsearch服务),Kibana和APM进行记录。

有效地,我需要在apm服务开始执行之前先启动Elasticsearch-但是顺序如此,以至于Elasticsearch需要在APM和Kibana开始执行之前完成。

这是我的docker-compose.yml文件和所有相关的依赖项:

version: "3"

services:
  api:
    build:
      context: api
    command: python3 manage.py runserver 0.0.0.0:8000
    env_file: api/.env
    volumes:
      - ./api:/usr/src/app
    ports:
      - 8000:8000
      - 6900:6900
    depends_on:
      - db

  db:
    build: docker/db
    environment:
      - POSTGRES_DB=************
      - POSTGRES_USER=dbaccount
      - POSTGRES_PASSWORD=dbpassword
    ports:
      - 5432:5432

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - discovery.type=single-node
      - cluster.routing.allocation.disk.threshold_enabled=false

  kibana:
    image: docker.elastic.co/kibana/kibana:6.5.1
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
  apm:
    image: docker.elastic.co/apm/apm-server:6.5.1
    volumes:
      - ./docker/apm/apm-server.yml:/usr/share/apm-server/apm-server.yml
    depends_on:
      - elasticsearch
    ports:
      - 8200:8200

有效地,运行顺序导致APM服务上的通用Linux chroot退出代码为“ 1”,并且需要手动进行“ docker-compose apm restart”操作。

是否有一种方法可以等待一项服务完全“启用”,然后再“启用”另一项?

2 个答案:

答案 0 :(得分:0)

如docker-compose文档中所述: https://docs.docker.com/compose/startup-order/

docker或compose无法在开始依赖之前由容器或容器组成,这些容器应由每个应用程序处理。

尽管在文档中显示了一种变通方法,但使用等待脚本:https://github.com/vishnubob/wait-for-it

答案 1 :(得分:0)

这里有一个github线程:

https://github.com/moby/moby/issues/30404#issuecomment-274825244

在这里

https://github.com/docker/compose/issues/4305

如果要对docker-compose使用运行状况检查,建议您使用v2.1,因为这是唯一支持它的版本。但是,如上述答案所述,此功能已删除,以方便从外部docker-compose移走:

https://github.com/docker/compose/issues/4305#issuecomment-276527457