使用docker-compose.yml自动删除容器

Fan*_*ung 33 docker docker-compose

docker-compose run有一个标志--rm,可以在运行后自动删除容器.我想知道是否有一个与docker-compose.yml等效的配置用于特定服务,因为我在yml中获得的服务之一是一次性构建过程,它应该只输出编译文件并自行消失.

tgo*_*gos 31

我没有找到任何选项来帮助您在docker-compose.yml文件中定义此行为,我认为解释如下:

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 rm` 是否符合您的需求... [https://docs.docker.com/compose/reference/rm/](https://docs.docker.com/compose/reference/rm/) (2认同)

Tho*_*wig 30

只需运行 docker-compose up && docker-compose rm -fsv

https://docs.docker.com/compose/reference/rm

  • 这有帮助,但我仍然希望“docker-compose up”有一个像“docker run”那样的“--rm”标志。 (13认同)
  • 使用此方法,如果使用“SIGTERM”(CTRL+C)停止容器,则无法删除容器 (7认同)
  • 仅当进程成功结束时才会删除容器。 (2认同)

小智 20

自从这个问题发布以来已经有一段时间了,但我认为在 2022 年分享一些对我的案例有用的东西会提供有用的信息:)但请记住,这个解决方案仍然不会删除旧容器,正如原作者的意图实现。

docker-compose up --force-recreate -V
Run Code Online (Sandbox Code Playgroud)

就我而言,我有一个小型 Redis 集群,我希望在停止服务器后完全删除数据。仅使用并--force-recreate不能解决问题,因为匿名卷仍然被重用。这就是-V发挥作用的地方。


Kas*_*per 6

我对此的解决方案是创建一个小 bash 脚本,该脚本随后会自动删除容器。

如果您使用的是 macOS,则可以将此脚本放在usr/local/bin. 假设它是 named 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
Run Code Online (Sandbox Code Playgroud)

编辑:更新了脚本,以便分离模式可以正常工作,添加break到 artu-hnrq 建议的循环中