使用 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 stopdocker-compose start 来启动/停止您的服务。这与docker-compose down 不同:

停止容器并删除由up 创建的容器、网络、卷和映像。

您正在尝试做的事情有问题:

如果您docker-compose up 并且您的一个容器完成了它的任务并被(自动)删除,那么您不能再次docker-compose stopdocker-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-compose.yml文件创建实例docker stack编排服务运行的实例删除不了

向 docker-compose.yml 公开随机端口

docker-compose.yml文件

Dockerfile 和 docker-compose.yml的区别

我应该把 docker-compose.yml 放在哪里