使用Docker Compose up -d命令时等待特定容器的方法

4
我正尝试使用Docker来管理测试应用程序的后台,需要运行以下几个组件:mongo、redis、localstack、localstack数据初始化和应用程序。我在本地主机上运行应用程序,而不是在Docker中运行。为此,我使用 docker compose up -d && node server.js 命令。但问题是如果以附加模式运行该命令,则node命令将永远不会运行;如果以分离模式运行,则数据初始化(setup-resources)无法在node应用程序之前完成。
我的Docker Compose配置如下:
services:
    mongo:
        image: mongo
        ports:
            - "27017:27017"
    redis:
        image: redis
        ports:
            - "6379:6379"
        depends_on:
            - setup-resources
    localstack:
        image: localstack/localstack
        ports:
            - "4566:4566"
        volumes:
            - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
            - "/var/run/docker.sock:/var/run/docker.sock"
    setup-resources:
        build: docker_dev/setup
        restart: "no"
        environment:
            - AWS_ACCESS_KEY_ID=hidden
            - AWS_SECRET_ACCESS_KEY=hidden
            - AWS_DEFAULT_REGION=hidden
            - ROOT_BUCKET
            - DPS_ARTIFACTS_ROOT_BUCKET
            - THUMBNAIL_BUCKET
        depends_on:
            - localstack    

设置资源的Dockerfile:

FROM mesosphere/aws-cli
ENTRYPOINT []
ENV ROOT_BUCKET ""
CMD aws --endpoint-url=http://localstack:4566 s3 mb s3://$ROOT_BUCKET-stage

Docker-compose 在启动依赖项之前并不会等待容器“准备就绪”。它只会等到它们运行。因此,建议的方法是编写程序,使它们可以重试连接,直到它们的依赖项准备就绪。 - Hans Kilian
这个回答解决了你的问题吗?Docker Compose在启动Y之前等待容器X - Rajesh Paudel
1个回答

3
您可以使用 --wait 标志(与 -d 标志一起使用)。 https://docs.docker.com/engine/reference/commandline/compose_up/
docker compose up -d --wait

在退出之前(并继续以分离模式运行),它将等待所有容器处于运行状态和健康状态。

如果容器标记为健康的时间比您需要的早,您可以定义自己的标准来标记容器为健康。 https://docs.docker.com/compose/compose-file/#healthcheck

services:
  grpc_wiremock:
    image: adven27/grpc-wiremock
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8888/__admin/mappings" ]
      interval: 10s
      timeout: 2s
      retries: 30
      start_period: 10s

请注意,如果存在来自镜像Dockerfile的健康检查,则此操作将覆盖它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接