Docker卷修剪:不删除命名卷

mbzjlibv  于 2023-03-17  发布在  Docker
关注(0)|答案(4)|浏览(110)

我已创建卷

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
如何避免。

7qhs6swi

7qhs6swi1#

从Docker 23.0.0开始,这是docker volume prune的默认行为,它只会清理匿名卷。对于需要返回到旧行为并修剪命名卷的任何人,您需要添加一个过滤器来包括命名卷:

docker volume prune --filter all=true

使用标签来控制要清理的内容也很有用,例如,我在测试场景中使用测试标签创建卷,然后仅显式地修剪那些卷:

docker volume create --label=preserve volume-to-keep
docker volume create --label=test volume-to-prune
# ... run tests
docker volume prune -f --filter label=test --filter all=true

以上要求您显式地创建每个卷,并且不依赖于匿名卷。这样您就可以避免在要保留的卷上设置该标签。

23.x.x之前的Docker版本的原始答案

docker volume prune命令中没有这个选项。卷上也没有元数据来表明它是匿名卷,它只是一个带有随机十六进制名称的命名卷。我所做的最好的事情是列出悬空卷并删除带有长十六进制名称的卷。只要您的命名卷不是正好64个十六进制字符,它们就不会包含在此卷中:

docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | \
  xargs --no-run-if-empty docker volume rm
nhaq1z21

nhaq1z212#

根据Docker的文档,您可以简单地过滤卷(例如,按标签):

docker volume prune --filter label!=postgresql_db

则将删除(请查看!)名为 postgresql_db 且未连接到一个或多个容器的所有卷。

mlnl4t2r

mlnl4t2r3#

它对我起作用了。删除所有未命名的卷:

docker volume prune --filter "label!=com.docker.compose.volume"
w6mmgewl

w6mmgewl4#

docker rm提供标记-v,该标记删除与该容器对应的所有匿名卷。
如果你也想删除悬空的容器(与你当前运行的任何容器都没有关联),在停止和删除运行的容器之前,先执行docker volume prune
因此:

docker volume prune  #<-- remove all dangling volumes also
docker stop $(docker ps -aq) # stop all containers 
docker rm -v $(docker ps -a -q) # remove all containers
docker container prune
docker image prune
docker network prune

相关问题