卷是匿名创建的,而不是命名并在每次向上/向下合成时重新创建 [英] Volumes being created anonymously instead of named and re-created on every compose up / down
本文介绍了卷是匿名创建的,而不是命名并在每次向上/向下合成时重新创建的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有几个码头容器,我使用docker-composeup/down启动和停止它们。在docker-compose.yml中,我为每个容器定义了一个卷。据我所知,这些目录应该作为命名卷出现在var/lib/docker/volumes下,但我看到的是一组隐蔽目录,每次我重新启动容器时,这些目录的数量也会增加。
每次重新启动容器时,当我认为我正在使用卷以避免出现这种情况时,数据库再次为空。我希望将数据持久化。我是不是做错了什么我错过了什么?
version: "3"
services:
nftapi:
env_file:
- .env
build:
context: .
ports:
- '5000:5000'
depends_on:
- postgres
networks:
- postgres
postgres:
container_name: postgres
image: postgres:latest
ports:
- "5432:5432"
volumes:
- /data/postgres:/data/postgres
env_file:
- docker.env
networks:
- postgres
pgadmin:
links:
- postgres:postgres
container_name: pgadmin
image: dpage/pgadmin4
ports:
- "8080:80"
volumes:
- /data/pgadmin:/root/.pgadmin
env_file:
- docker.env
networks:
- postgres
networks:
postgres:
driver: bridge
卷目录屏幕
推荐答案
Docker Hub postgres
image将其数据保存在/var/lib/postgresql/data
中(参见"Where to store data" in the extended description)。您需要更改绑定挂载,使其成为其中命名的第二个目录。
volumes:
- /data/postgres:/var/lib/postgresql/data
# ^^^^^^^^^^^^^^^^^^^^^^^^
# second half must be this exact path
这就是为什么您看不到数据持久保存在主机目录中的原因;它装载在错误的路径上。
同时,图像的Dockerfile
contains a VOLUME
declaration for that directory。这会导致Docker在没有装载任何其他内容的情况下为该目录创建匿名卷。docker-compose down
文档说明:
默认情况下不会删除匿名卷[由docker-compose down
删除]。但是,由于它们没有稳定的名称,后续的up
将不会自动装入它们。
这就是为什么您在重新启动后也看不到数据库数据保留的原因;修复挂载路径将解决此问题。
(在an earlier question中,您询问额外的卷来自哪里,它是由DockerfileVOLUME
创建的匿名卷。@larsks's answer很好地讨论了命名卷和绑定装载之间的区别;它们在答案末尾提到的匿名卷都是相同的VOLUME
机制。)
这篇关于卷是匿名创建的,而不是命名并在每次向上/向下合成时重新创建的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文