1:通过容器名称前缀删除

1:通过容器名称前缀删除

当您这样做时docker-compose up,它基于一个docker-compose.yml文件。

这通常会启动网络、建立并运行多个服务。如果您使用标志执行此操作-ddocker-compose客户端将断开连接,让服务器独自运行。

如果您执行docker-compose down,它会关闭正在运行的容器并删除相应的网络。

但是... 如果之后文件不见了怎么up.yml

问题

您是否必须通过docker stop手动查找该项目的服务等docker rm来手动执行关闭操作docker network rm

或者docker-compose是否足够智能,可以用标签来标记所有事物(容器,网络等),以便您可以告诉它一些事情,docker-compose down project-name这样它就不会查看.yml(现在不在文件系统中)文件,而是检查正在运行的实例和网络?

答案1

据我所知,你不能只使用docker-compose down没有相应的docker-compose.yml

但是,你对标记的想法也并非遥不可及:调用时docker-compose updocker-compose用 Compose 文件的目录名作为其创建的所有内容的前缀。这样即使没有相应的docker-compose.yml文件,也可以识别属于同一类的容器集。我经常在我的交互式 shell 中写入此内容的变体:

docker rm $(docker ps -a | grep ... | cut -c -16)

当然,如果要“正确”地编写该脚本,可以使用 Docker 格式化和搜索其输出的功能,并正确依赖名称或 ID,而不仅仅是 ID 的前 16 个字符。此外,此操作是幂等的,因为如果没有匹配项,它将失败grep

随后跟进docker network rm ...docker volume rm ...清理剩余部分。

答案2

扩展@linux_fan 的回答,没有docker compose文件就无法直接执行down。

有两种可行的解决方案,可以发挥作用,但都有其局限性:

1:通过容器名称前缀删除

重要的:如果您为容器指定了自定义名称,则必须手动删除这些容器,因为它们不包含前缀。

此方法是 linux-fan 解决方案的变体,但用选项替换了 grep -f。您可以通过 找到 docker 认为 docker-compose.yml 文件所在的位置docker compose ls。在那里,在 列中name,您还将看到 Docker Compose 生成的每个容器的前缀。

  1. 停止容器docker container stop $(docker ps -q -f name=<DOCKER_COMPOSE_PREFIX>)
  2. 移除容器docker container rm $(docker ps -a -q -f name=<DOCKER_COMPOSE_PREFIX>)
  3. 删除网络:docker network rm $(docker network ls -q -f name=<DOCKER_COMPOSE_PREFIX>)
  4. 删除所有卷:docker volume rm $(docker volume ls -q -f name=<DOCKER_COMPOSE_PREFIX>)

解释

  • docker ps打印出所有正在运行的容器
  • -q仅打印出 ID
  • -a打印出所有容器,无论是否正在运行
  • -f过滤掉,因此只打印名称中带有前缀的 ID

2:通过网络删除

您还可以通过查看 docker compose 文件生成的网络来删除。默认情况下,docker compose 会生成一个网络,其中保存所有容器。

警告:此方法将关闭网络中的任何容器(例如,如果你出于某种原因手动将不同的容器添加到docker compose生成的网络中)

  1. docker network ls -q -f name=<DOCKER_COMPOSE_PREFIX>
  2. docker network inspect <YOUR_DOCKER_COMPOSE_NETWORK_ID>
  3. 查找Containers字典
  4. docker container stop <CONTAINTER_ID>通过和 停止并删除此列表中找到的所有容器docker container rm <CONTAINTER_ID>

此方法应该捕获任何具有自定义名称但仍在默认 docker compose 网络中的容器。

请注意,这是一个非常手动的过程,但是您可能应该能够通过 ChatGPT 生成一个自动执行此操作的 bash 脚本。

相关内容