我已创建卷
docker volume create postgresql_db
现在我在我的docker-compose.xml中使用它
services:
postgresql:
image: "postgres:11-alpine"
volumes:
- type: volume
source: postgresql_data
target: /var/lib/postgresql/data
volume:
nocopy: true
environment:
PGDATA: '/var/lib/postgresql/data/pgdata'
networks: # connect to the bridge
- postgresql_network
command: ["postgres", "-c", "log_statement=all","-c", "log_destination=stderr"]
volumes:
postgresql_data:
external: true
有时候我想停下来清理一下码头系统。
所以我试着逃跑
docker stop $(docker ps -aq) # stop all containers
docker rm $(docker ps -a -q) # remove all containers
docker container prune
docker image prune
docker network prune
docker volume prune #<-- remove all dangling volumes also
这也会删除postgresql_data
,即named volume
如何避免。
4条答案
按热度按时间7qhs6swi1#
从Docker 23.0.0开始,这是
docker volume prune
的默认行为,它只会清理匿名卷。对于需要返回到旧行为并修剪命名卷的任何人,您需要添加一个过滤器来包括命名卷:使用标签来控制要清理的内容也很有用,例如,我在测试场景中使用测试标签创建卷,然后仅显式地修剪那些卷:
以上要求您显式地创建每个卷,并且不依赖于匿名卷。这样您就可以避免在要保留的卷上设置该标签。
23.x.x之前的Docker版本的原始答案
docker volume prune
命令中没有这个选项。卷上也没有元数据来表明它是匿名卷,它只是一个带有随机十六进制名称的命名卷。我所做的最好的事情是列出悬空卷并删除带有长十六进制名称的卷。只要您的命名卷不是正好64个十六进制字符,它们就不会包含在此卷中:nhaq1z212#
根据Docker的文档,您可以简单地过滤卷(例如,按标签):
则将删除不(请查看
!
)名为 postgresql_db 且未连接到一个或多个容器的所有卷。mlnl4t2r3#
它对我起作用了。删除所有未命名的卷:
w6mmgewl4#
docker rm
提供标记-v
,该标记删除与该容器对应的所有匿名卷。如果你也想删除悬空的容器(与你当前运行的任何容器都没有关联),在停止和删除运行的容器之前,先执行
docker volume prune
。因此: