我有一个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 down
和docker-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