与postgres映像关联的Docker卷为空且不持久



我有一个docker compose文件来构建一个带有django和postgres数据库的web服务器。基本上看起来是这样的:

version: '3'
services:
server:
build:
context: .
dockerfile: ./docker/server/Dockerfile
image: backend
volumes:
- ./api:/app
ports:
- 8000:8000
depends_on:
- postgres
- redis
environment:
- PYTHONUNBUFFERED=1
postgres:
image: kartoza/postgis:11.0-2.5
volumes:
- pg_data:/var/lib/postgresql/data:rw
environment:
POSTGRES_DB: "gis,backend"
POSTGRES_PORT: "5432"
POSTGRES_USER: "user"
POSTGRES_PASS: "pass"
POSTGRES_MULTIPLE_EXTENSIONS: "postgis,postgis_topology"
ports:
- 5432:5432
redis:
image: "redis:alpine"
volumes:
pg_data:

我正在使用卷使数据持久化我设法运行了我的容器并将数据添加到数据库中。已成功创建卷:docker volume ls

DRIVER              VOLUME NAME
local               server_pg_data

但是这个卷是空的,因为docker system df -v的输出显示:

Local Volumes space usage:
VOLUME NAME                                                        LINKS               SIZE
server_pg_data                                                     1                   0B

此外,如果我希望或需要使用docker-compose downdocker-compose up再次构建容器,则数据已从数据库中清除。然而,我认为卷是用来使数据在磁盘上持久化的…

我一定在使用docker和Volume的过程中遗漏了一些东西,但我不明白:

  • 为什么我的卷显示为空,而我的postgres容器中有一些数据
  • 为什么做了docker-compose down之后我的音量没有持续

这个线程(如何使用卷在dockerized postgres数据库中持久化数据(看起来很相似,但解决方案似乎不适用。

kartoza/postgis映像的配置方式与标准postgres映像不同。其文档注释(在"集群初始化"下(:

默认情况下,DATADIR将指向/var/lib/postgresql/{major-version}。您可以像这样装载父位置:-v data-volume:/var/lib/postgresql

如果你查看GitHub中的Dockerfile,你还会看到名为VOLUME的父目录,它在这里有一些有趣的语义。

使用您显示的设置,实际数据将存储在/var/lib/postgresql/11.0中;您正在将命名卷装载到另一个目录/var/lib/postgresql/data上,这就是它保持为空的原因。将卷装载更改为仅/var/lib/postgresql应该解决以下问题:

volumes:
- pg_data:/var/lib/postgresql:rw # not .../data

最新更新