Docker 与 postgres 图像关联的卷为空且不持久
Docker volume associated to postgres image empty and not persistent
我有一个 docker-compose 文件来构建一个带有 django 和 postgres 数据库的网络服务器。它基本上是这样的:
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 和卷的方式中遗漏了一些东西,但我不明白是什么:
- 为什么我的卷显示为空,而我的 postgres 容器中有一些数据?
- 为什么我的音量在执行
docker-compose down
后没有持续存在?
此讨论帖 () 看起来很相似,但解决方案似乎并不适用。
The kartoza/postgis
image 的配置方式与标准 postgres
图像不同。它的文档说明(在“集群初始化”下):
By default, DATADIR
will point to /var/lib/postgresql/{major-version}
. You can instead mount the parent location like this: -v data-volume:/var/lib/postgresql
如果您查看 GitHub 中的 Dockerfile,您还会看到 that parent directory named as a VOLUME
,其中有一些有趣的语义。
根据您显示的设置,实际数据将存储在/var/lib/postgresql/11.0
;您正在将指定的卷安装在不同的目录 /var/lib/postgresql/data
上,这就是它保持为空的原因。将卷装载更改为 /var/lib/postgresql
应该可以解决这个问题:
volumes:
- pg_data:/var/lib/postgresql:rw # not .../data
我有一个 docker-compose 文件来构建一个带有 django 和 postgres 数据库的网络服务器。它基本上是这样的:
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 和卷的方式中遗漏了一些东西,但我不明白是什么:
- 为什么我的卷显示为空,而我的 postgres 容器中有一些数据?
- 为什么我的音量在执行
docker-compose down
后没有持续存在?
此讨论帖 (
The kartoza/postgis
image 的配置方式与标准 postgres
图像不同。它的文档说明(在“集群初始化”下):
By default,
DATADIR
will point to/var/lib/postgresql/{major-version}
. You can instead mount the parent location like this:-v data-volume:/var/lib/postgresql
如果您查看 GitHub 中的 Dockerfile,您还会看到 that parent directory named as a VOLUME
,其中有一些有趣的语义。
根据您显示的设置,实际数据将存储在/var/lib/postgresql/11.0
;您正在将指定的卷安装在不同的目录 /var/lib/postgresql/data
上,这就是它保持为空的原因。将卷装载更改为 /var/lib/postgresql
应该可以解决这个问题:
volumes:
- pg_data:/var/lib/postgresql:rw # not .../data