Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使容器在Docker Compose中等待其他容器_Docker_Deployment_Configuration_Containers_Docker Compose - Fatal编程技术网

如何使容器在Docker Compose中等待其他容器

如何使容器在Docker Compose中等待其他容器,docker,deployment,configuration,containers,docker-compose,Docker,Deployment,Configuration,Containers,Docker Compose,我遵循教程,尝试使用Docker Compose而不是调用Docker client的shell脚本启动基础结构。一切正常,除了gitlab容器在gitlab postgreql和gitlab redis之前启动,因此失败了,因为它希望这些服务已经运行 我尝试使用depends_on attributes,但没有解决问题。据我所知,如果其他容器的启动速度更快,那也没用。经过研究,我发现Docker Compose没有提供现成的解决方案来控制容器创建顺序 这怎么可能?我真不敢相信这样一个基本特性竟

我遵循教程,尝试使用Docker Compose而不是调用Docker client的shell脚本启动基础结构。一切正常,除了gitlab容器在gitlab postgreql和gitlab redis之前启动,因此失败了,因为它希望这些服务已经运行

我尝试使用depends_on attributes,但没有解决问题。据我所知,如果其他容器的启动速度更快,那也没用。经过研究,我发现Docker Compose没有提供现成的解决方案来控制容器创建顺序

这怎么可能?我真不敢相信这样一个基本特性竟然没有实现。似乎Docker在自己的聪明上跌跌撞撞,忘记了最基本的东西。现在,在没有疯狂的支持脚本的情况下,我如何控制容器的创建顺序(这将使整个配置比最初使用脚本/docker client处理所有事情更加混乱)

这是docker-compose.yml的原样

version: '2'
services:

  gitlab-postgresql:
    image: sameersbn/postgresql:9.4-3
    volumes:
      - /srv/docker/gitlab/postgresql:/var/lib/postgresql
    environment:
      - DB_NAME=gitlabhq_production
      - DB_USER=gitlab
      - DB_PASS=password

  gitlab-redis:
    image: sameersbn/redis:latest
    volumes:
      - /srv/docker/gitlab/redis:/var/lib/redis
    depends_on:
      - "gitlab-postgresql"

  gitlab:
    image: sameersbn/gitlab:7.14.3
    volumes:
      - /srv/docker/gitlab/gitlab:/home/git/data
    ports:
      - "2222:22"
      - "8080:80"
    environment:
      - GITLAB_PORT=8080
      - GITLAB_SSH_PORT=2222
    depends_on:
      - gitlab-postgresql
      - gitlab-redis

  registry:
    image: registry:2
    volumes:
      - /srv/docker/registry/data:/var/lib/registry
    ports:
      - "5000:5000"
    depends_on:
      - "gitlab"

  jenkins:
    image: jenkins:1.609.3
    volumes:
      - /srv/docker/jenkins/home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/bin/docker
      - /usr/lib/x86_64-linux-gnu/libapparmor.so.1.1.0:/lib/x86_64-linux-gnu/libapparmor.so.1
    ports:
      - "8081:8080"
      - "50000:50000"
    user: root
    depends_on:
      - "registry"
gitlab容器在gitlab postgreql和gitlab redis之前启动

您正在使用的
依赖于
,等待docker容器状态不是“启动”,但此容器中的每个服务或程序都可能是“未完成”或处于“运行”或“启动”等状态

我想这正是你需要的

使用工具,如wait wait或dockerize。这些是小包装 可以包含在应用程序映像中的脚本,并将 轮询给定的主机和端口,直到它接受TCP连接。 假设应用程序的映像在Dockerfile中设置了CMD, 您可以通过在docker-compose.yml中设置入口点来包装它:

因此,您需要在postgres端口可用且postgre处于运行状态后等待的入口点。 例如,在docker compose中,您将需要
entrypoint:./wait-for-it.sh db:5432

在脚本中,您将每秒检查postgre是否正在运行-docker容器将被阻止,直到postgre不可用

与文档中类似:

until psql -h "$host" -U "postgres" -c '\l'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

如果使用compose v2.1+(但不是3+,因为它删除了
条件
),则可以将
依赖于
健康检查一起使用

例如,在数据库容器中:

healthcheck:
  test: ["CMD-SHELL", "pg_isready -U postgres"]
  interval: 30s
  timeout: 30s
  retries: 3
依赖于数据库的项目:

depends_on:
  kong-database:
    condition: service_healthy

这太荒谬了。好吧,与其浪费时间学习这些黑客来学习一个坏掉的工具,不如等它变得更成熟。无论如何,谢谢你的回答,这是一个有趣的笑话。@TuomasToivonen好吧,这个问题在分布式系统领域并不容易解决,正如他们建议的那样,最好的方法是在应用层执行签入。但我同意它应该由compose自己提供,但现在这个“变通方法”是docker文档的官方建议。不管怎么说,这项功能(从2014年开始开放)回答得很好,我不知道它是docker compose文档的一部分。这个问题用不同的变量被问了很多次。这个链接很容易回答这些问题