使用 docker compose up -d 时等待特定容器

Int*_*uin 5 docker docker-compose

我正在尝试使用 docker 来管理用于测试应用程序的幕后内容,其中需要运行一些内容:mongo、redis、localstack、localstack 数据初始化,然后是应用程序。我在 Docker 之外本地运行该应用程序。为此,我正在运行docker compose up -d && node server.js,但问题是我无法执行附加操作,否则节点命令将永远不会运行,并且如果我执行分离操作,则数据初始化 ( setup-resources) 将不会在节点应用程序运行之前完成。

我的码头工人组成:

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    
Run Code Online (Sandbox Code Playgroud)

设置资源dockerfile:

FROM mesosphere/aws-cli
ENTRYPOINT []
ENV ROOT_BUCKET ""
CMD aws --endpoint-url=http://localstack:4566 s3 mb s3://$ROOT_BUCKET-stage
Run Code Online (Sandbox Code Playgroud)

Ant*_*nio 4

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

docker compose up -d --wait
Run Code Online (Sandbox Code Playgroud)

它将等到所有容器都处于 RUNNING 和 HEALTHY 状态后再退出(并继续以分离模式运行)。

如果容器比您需要的更早标记为“健康”,您可以定义自己的标准来将容器标记为“健康” 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
Run Code Online (Sandbox Code Playgroud)

请注意,这将覆盖镜像 Dockerfile 中的运行状况检查(如果存在)。