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 downdocker-compose up 再次构建容器,数据已从我的数据库中清除。然而,我认为卷是用来使数据持久保存在磁盘上的……

我一定是在使用 docker 和卷的方式中遗漏了一些东西,但我不明白是什么:

此讨论帖 () 看起来很相似,但解决方案似乎并不适用。

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