如何仅在退出另一个容器后才启动 Docker 容器

问题描述 投票:0回答:2

假设我有 2 个容器:

composer
php
,它们共享相同的代码库,即相同的体积。我想用一个 docker-compose 命令来管理它们,比如
docker-compose up

所以问题是如何才能一一启动这些容器,而不是同时启动?我的意思是,仅在

php
容器退出后才启动我的
composer
容器,即
composer
容器应为我的
php
容器安装所有供应商并退出,然后且仅当
php
容器应启动内置已安装供应商的 PHP Web 服务器。

附注现在我得到了两个容器同时启动的行为。所以我的

php
容器正在尝试在没有供应商的情况下启动 Web 服务器,而
composer
容器正在尝试安装这些供应商。

这种情况有好的解决办法吗?

php docker composer-php docker-compose
2个回答
6
投票

有几件事可以帮助您;

  • depends_on:它不等待另一个服务完成,它只等待其他服务启动。请参阅:取决于
  • health_check:在命令返回成功之前不会启动服务。请参阅:健康检查
  • 创建一个 shell 脚本来初始化容器/服务。请参阅:启动顺序

0
投票

自 2023 年以来,您有一个名为

service_completed_successfully
的 dependent_on 条件的新选项,并且它的工作原理完全符合您的预期(请参阅文档)

例如,如果您想在单独的容器中运行数据库迁移(您应该这样做以避免并发问题以及尝试多次运行的迁移),您将拥有以下 docker compose 文件:

compose.yaml

services:
  migrations:
    build: .
    command: ./run_migrations.sh
    depends_on:
      db:
        condition: service_healthy
        restart: true
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
        restart: true
      migrations:
        condition: service_completed_successfully
  db:
    image: postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      retries: 5
      start_period: 30s
      timeout: 10s
© www.soinside.com 2019 - 2024. All rights reserved.