使用 docker-compose.yml 自动删除容器
Posted
技术标签:
【中文标题】使用 docker-compose.yml 自动删除容器【英文标题】:Auto remove container with docker-compose.yml 【发布时间】:2018-04-22 18:54:09 【问题描述】:docker-compose run
有一个标志--rm
,它会在运行后自动删除容器。我想知道对于特定服务是否有与 docker-compose.yml 等效的配置,因为我在 yml 中获得的服务之一是一次性构建过程,它应该只输出编译文件并自行消失。
【问题讨论】:
2018-11 仍然不可能 :(不要像我一样浪费时间搜索(至少在接下来的几个月内不会;)) 我将docker-compose up -d && docker-compose rm -f
用于类似的场景。
@MauriceMüller 你不知道有没有更新吗?
【参考方案1】:
我没有找到任何选项来帮助您在 docker-compose.yml
文件中定义此行为,我认为解释是它会破坏某些 docker-compose ...
命令的工作方式。
更多关于 up
/down
, start
/stop
的事情:
docker-compose up
为服务构建、(重新)创建、启动和附加到容器。
由于您的images
已构建并且您的服务的containers
已启动,您可以使用docker-compose stop
和docker-compose start
来启动/停止您的服务。这与docker-compose down
不同:
停止容器并删除由
up
创建的容器、网络、卷和映像。
您正在尝试做的事情有问题:
如果您docker-compose up
并且您的一个容器完成了它的任务并被(自动)删除,那么您不能再次docker-compose stop
和docker-compose start
。被移除的容器将不会再出现start
它。
你可能想看看:
docker-compose: option to automaticaly remove container after run in docker-compose.yml What is the difference between docker-compose up and docker-compose start?【讨论】:
是的,这证实了我的研究被接受为答案。如果有一个选项,那就太好了,因为其中一个容器就在那里进行一次 webpack 生产构建。猜猜需要为它写bash 检查docker-compose rm
是否符合您的需求...https://docs.docker.com/compose/reference/rm/【参考方案2】:
只需运行docker-compose up && docker-compose rm -fsv
?
?https://docs.docker.com/compose/reference/rm
【讨论】:
这有帮助,但我仍然希望docker-compose up
有一个 --rm
标志,就像 docker run
一样。
@Iwazaru docker-compose up -V
?【参考方案3】:
我对此的解决方案是创建一个小 bash 脚本,之后会自动删除容器。
如果您使用的是 macOS,则可以将此脚本放入 usr/local/bin
。假设它被命名为dco
,那么您可以运行chmod +x usr/local/bin/dco
以使其可执行。在 Windows 上,我不知道如何让它工作,但在 Linux 上应该是类似的。
#! /bin/bash
# check for -d, --detached
DETACHED=false
for (( i=1; i <= "$#"; i++ )); do
ARG="$!i"
case "$ARG" in
-d|--detach)
DETACHED=true
break
;;
esac
done
if [[ $1 == "run" ]] && [[ $DETACHED == false ]]; then
docker-compose run --rm "$@:2"
elif [[ $1 == "up" ]] && [[ $DETACHED == false ]]; then
docker-compose up "$@:2"; docker-compose down
else
docker-compose "$@:1"
fi
编辑:更新了脚本,使分离模式可以正常工作,将break
添加到artu-hnrq建议的循环中
【讨论】:
不错的解决方案!然而你的for
在打开DETACHED
后仍然在循环。 using break
可以做一点改进
@artu-hnrq 感谢您的建议,添加它【参考方案4】:
我不确定我是否理解,docker-compose run --user 是一个选项,并且 docker-compose.yml 支持用户密钥 (http://docs.docker.com/compose/yml/#working95dir-entrypoint-user-hostname-domainname-mem95limit-privileged-restart-stdin95open-tty-cpu95shares)。
【讨论】:
docker-compose -rm up 据我研究不支持。想知道 docker-compose.yml 中是否有可用的 rm 密钥。我翻阅了文档找不到它。【参考方案5】:这个问题发布已经有一段时间了,但我认为在 2022 年分享一些对我的案例有用的东西会很有帮助:) 但请记住,此解决方案仍然不会像原作者打算实现的那样删除旧容器。
docker-compose up --force-recreate -V
就我而言,我有一个小型 Redis 集群,我希望在我停止服务器后完全擦除其中的数据。
只使用--force-recreate
并没有成功,因为匿名卷仍然被重用。这就是-V
的用武之地。
【讨论】:
以上是关于使用 docker-compose.yml 自动删除容器的主要内容,如果未能解决你的问题,请参考以下文章
用docker-compose.yml文件创建实例docker stack编排服务运行的实例删除不了