如何使用docker compose关闭依赖容器?

如何使用docker compose关闭依赖容器?,docker,docker-compose,Docker,Docker Compose,我有两个使用docker compose旋转的容器: web: image: personal/webserver depends_on: - database entrypoint: /usr/bin/runmytests.sh database: image: personal/database 在本例中,runmytests.sh是一个运行几秒钟的脚本,然后返回零或非零退出代码 当我使用docker compose运行此设置时,web_1运行脚本并退出数据库_1保

我有两个使用docker compose旋转的容器:

web:
  image: personal/webserver
  depends_on:
    - database
  entrypoint: /usr/bin/runmytests.sh
database:
  image: personal/database
在本例中,runmytests.sh是一个运行几秒钟的脚本,然后返回零或非零退出代码

当我使用docker compose运行此设置时,
web_1
运行脚本并退出<代码>数据库_1保持打开状态,因为运行数据库的进程仍在运行


我想在web_1的任务完成后触发数据库_1上的优雅退出。

我不相信docker compose支持此用例。但是,制作一个简单的shell脚本很容易解决以下问题:

#!/bin/sh

docker run -d --name=database personal/database
docker run --rm -it --entrypoint=/usr/bin/runmytests.sh personal/webserver
docker stop database
docker rm database

你所描述的是Kubernetes中的Pod或AWS中的任务。它是构成一个单元的一组容器。Docker目前还没有这个概念(Swarm模式有“任务”,它们很接近,但目前每个任务只支持一个容器)

除了像@BMitch所描述的那样编写脚本之外,还有一个黑客解决方法。您可以从主机装载Docker守护程序套接字。例如:

web:
  image: personal/webserver
  depends_on:
    - database
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  entrypoint: /usr/bin/runmytests.sh
并将Docker客户端添加到您的
个人/webserver
图像中。这将允许runmytests.sh脚本首先使用Docker CLI关闭数据库。例如:
docker kill数据库

编辑:
第三种选择。如果要在一个容器出现故障时停止所有容器,您可以使用
--abort on container exit
选项来
docker compose
,正如@dnephin在另一个答案中提到的那样。

您可以将
--abort on container exit
标志传递到
docker compose up
以在一个容器退出时让其他容器停止。

这似乎需要更多的参与是您只需将
--abort on container exit
标志传递给
docker compose up
即可停止其他容器。@dnephin在这种情况下您是正确的(即:所有其他容器都将停止)。我总是认为人们发布的docker compose文件是他们真正的compose文件的简化版,其中定义了多个服务。我将把这个信息添加到我的答案中。安装docker套接字应该被视为容器的最后手段,它只适用于管理其他容器的容器。对于运行数据库的脚本来说,使用这种方法将是过分的。任何安装了此套接字的容器都为主机及其运行的任何容器提供了对该容器中运行的任何命令的完全root访问权限。我总是忘记了这些命令的CLI选项,有很多可能。答案很好,这应该是公认的答案。