当您这样做时docker-compose up
,它基于一个docker-compose.yml
文件。
这通常会启动网络、建立并运行多个服务。如果您使用标志执行此操作-d
,docker-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 up
,docker-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 生成的每个容器的前缀。
- 停止容器
docker container stop $(docker ps -q -f name=<DOCKER_COMPOSE_PREFIX>)
- 移除容器
docker container rm $(docker ps -a -q -f name=<DOCKER_COMPOSE_PREFIX>)
- 删除网络:
docker network rm $(docker network ls -q -f name=<DOCKER_COMPOSE_PREFIX>)
- 删除所有卷:
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生成的网络中)
docker network ls -q -f name=<DOCKER_COMPOSE_PREFIX>
docker network inspect <YOUR_DOCKER_COMPOSE_NETWORK_ID>
- 查找
Containers
字典 docker container stop <CONTAINTER_ID>
通过和 停止并删除此列表中找到的所有容器docker container rm <CONTAINTER_ID>
此方法应该捕获任何具有自定义名称但仍在默认 docker compose 网络中的容器。
请注意,这是一个非常手动的过程,但是您可能应该能够通过 ChatGPT 生成一个自动执行此操作的 bash 脚本。