2

我有以下docker-compose.yml文件:

# some other services here
......
......    

#############################
# Setup PostgreSQL container
#############################

  service-postgres:
    image: postgres:10-alpine
    container_name: service-postgres-server
    volumes:
      - ./data/postgres:/var/lib/postgresql
      - ./docker/initdb:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=db_name

每次我尝试重建运行 force-recreate 的容器时,我都会丢失我的数据库模式和数据:

docker-compose up -d --force-recreate --build

但是当我往下看时,data/postgres我发现文件和设置在那里:

-$ ls data/postgres
PG_VERSION           pg_commit_ts         pg_ident.conf        pg_notify            pg_snapshots         pg_subtrans          pg_wal               postgresql.conf
base                 pg_dynshmem          pg_logical           pg_replslot          pg_stat              pg_tblspc            pg_xact              postmaster.opts
global               pg_hba.conf          pg_multixact         pg_serial            pg_stat_tmp          pg_twophase          postgresql.auto.conf postmaster.pid

每次需要重建系统时,如何解决问题并保留我的数据库模式和数据。

4

1 回答 1

3

为什么数据库数据会丢失?

我尝试了不同的方法并将MySQL 映像PostgreSQL 映像进行了比较。现在我发现了问题。使用命名卷或挂载卷没有区别,您必须在容器上绑定正确的文件夹才能持久保存数据库数据:

services:
  service-postgres:
    image: postgres:10-alpine
    container_name: service-postgres-server
    volumes:
      - ./data/postgres/data:/var/lib/postgresql/data
      - ./docker/initdb:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: root
      POSTGRES_DB: db_name

您必须将/var/lib/postgresql/data文件夹绑定到主机而不是/var/lib/postgresql文件夹。您还可以将两个文件夹都挂载到主机(data文件夹和postgres文件夹),但您需要data保留文件夹。在 MySQL 映像上,您只需/var/lib/mysql要将数据保存在主机上的文件夹。

只是为了比较: MySQL 图像:

services:
  service-mysql:
    image: mysql:5.7
    container_name: service-mysql-server
    volumes:
      - ./data/mysql-db:/var/lib/mysql
      - ./docker/initdb:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    environment:
      MYSQL_PASSWORD: root
      MYSQL_DATABASE: db_name

通过上述配置,MySQL 数据将持久保存在主机上。

使用命名卷:

services:
  service-postgres:
    image: postgres:10-alpine
    container_name: service-postgres-server
    volumes:
      - postgresql-data:/var/lib/postgresql/data
      - ./docker/initdb:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: root
      POSTGRES_DB: db_name

volumes:
  postgresql-data:

使用命名卷,您可以使用docker-compose down -v它来删除它。您无法使用该docker-compose down命令删除已安装的卷。

您可以在带有 的卷列表中找到该卷docker volume ls。您还可以检查docker volume inspect <volume-name>用于获取主机上的挂载点的卷。

于 2018-03-07T16:04:33.967 回答