docker build忽略存储在我的卷中的现有数据和数据库配置

时间:2018-03-07 15:42:33

标签: docker docker-compose docker-volume datapersistance

我有以下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

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

1 个答案:

答案 0 :(得分:3)

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

我尝试了不同的方法,并将MySQL imagePostgreSQL image进行了比较。现在我发现了问题。使用命名卷或已安装卷没有区别,您必须绑定容器上的correct folder以保留数据库数据:

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>检查卷,以获取主机上的挂载点。