如何用docker-composeclosures一个依赖容器?

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

web: image: personal/webserver depends_on: - database entrypoint: /usr/bin/runmytests.sh database: image: personal/database 

在这个例子中,runmytests.sh是一个运行了几秒钟的脚本,然后返回一个零或非零的退出码。

当我用web_1 -compose运行这个设置时, web_1运行脚本并退出。 database_1保持打开状态,因为运行数据库的进程仍在运行。

当web_1的任务完成后,我想在database_1上触发一个优雅的退出。

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

我不相信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客户端添加到您的personal/webserver映像。 这将允许您的runmytests.sh脚本使用Docker CLI首先closures数据库。 例如: docker kill database

编辑:第三个选项。 如果你想在一个失败的时候停止所有的容器,你可以在另一个答案中使用--abort-on-container-exit选项将docker docker-compose作为@dnephin提及。