docker-compose down 不持久化 postgresql 数据

docker-compose down not persisting postgresql data

我的docker-撰写文件:

version: '3'

services:
  app:
    container_name: application
    build: .cloud/php
    image: app-application
    depends_on:
      - pgres
    ports:
      - "9050:9000"
    volumes:
      - ./:/var/www:cached
    networks:
      - application_network

  nginx:
    container_name: application.nginx
    image: nginx
    ports:
      - "8050:8000"
    volumes:
      - .cloud/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:cached
      - ./:/var/www:cached
    depends_on:
      - app
    networks:
      - application_network

  pgres:
    container_name: application.postgres
    image: postgres
    restart: always
    ports:
      - "54325:5432"
    environment:
      POSTGRES_DB: application
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: example
      PGDATA: /tmp
    volumes:
      - .cloud/postgres/data:/var/lib/postgresql/data
    networks:
      - application_network
networks:
  application_network:
    driver: bridge

当我 运行 docker-compose down 时,postgresql 数据不持久并且数据库完全重置。我试图将 postgresql 卷放入它自己的 /postgresql/data 文件夹中,但结果仍然相同。我在这里错过了什么?

问题就在这里

    environment:
      PGDATA: /tmp
    volumes:
      - .cloud/postgres/data:/var/lib/postgresql/data

使用 PGDATA 环境变量,您正在明确设置 clustur data dicrectory。因此,它的作用是,一旦您启动容器(例如通过 docker-compose up),Postgres 服务器将根据 /tmp 目录中的 PGDATA 设置保留您的数据库数据。 另一方面,您在容器中安装了不同的路径 (/var/lib/postgresql/data) 而不是 /tmp 路径。因此,一旦你 运行 docker-compose down/tmp 中的容器和持久化数据将永远消失,因为 /tmp 未设置为挂载点。所以,除非你真的需要这样做,否则你最好不要碰它。

工作配置可能看起来像这样(为简洁起见缩短):

version: '3'
services:
  pgres:
    image: "postgres" # use latest official postgres version or a specific version e.g. postgres:10.12
    volumes:
      - .cloud/postgres/:/var/lib/postgresql/data/ # persist data even if container shuts down

另一件事是,即使假设您像这样通过 PGDATA 配置它

    environment:
      PGDATA: /tmp
    volumes:
      - .cloud/postgres/data:/tmp

这不是一个好主意,因为路径 /tmp 在您的情况下,正如名称 tmp (temporary) 所暗示的那样,真的不靠谱。 docker-compose down 可能根本不会影响它,但是在下次启动时,即一旦你再次 运行 docker-compose up,底层的 OS (Linux) 将会非常很可能会删除目录 /tmp 的内容,因此挂载的本地目录 .cloud/postgres/data 也将立即清空,您的持久数据将消失。在任何情况下,/tmp 目录在某种程度上由 Linux 管理,因此保存在那里的数据可能会随时消失 - 所以不要依赖它!