如何将现有的postgres数据文件夹复制和使用到docker postgres容器中

时间:2019-09-03 10:58:22

标签: postgresql docker

我想构建用于测试某些问题的postgres docker容器。 我有:

  1. postgres文件的存档文件夹(/var/lib/postgres/data/

  2. 将文件夹放置到doccker postgres:latest中的Dockerfile。

我想要:

  1. Docker映像,该映像在重新创建映像后会重置自身状态。

  2. 具有数据库状态基于的容器传递到容器postgres文件中

  3. 我不想等待很长时间的备份操作并使用/docker-entrypoint-initdb.d初始化脚本还原现有数据库。

  4. 我不想使用卷,因为我不需要在重启之间存储新数据(这就是为什么该帖子与How to use a PostgreSQL container with existing data?不同。因为使用了帖子卷)

我的建议是在构建阶段将Postgres文件(/var/lib/postgres/data/)从主机复制到Docker的/var/lib/postgres/data/中。

但是在initdb阶段执行时,postgres docker会替换此文件。

如何要求Postgres码头工人不覆盖数据库文件?

例如 Dockerfile

FROM postgres:latest


COPY ./postgres-data.tar.gz /opt/pg-data/
WORKDIR /opt/pg-data
RUN tar -xzf postgres-data.tar.gz
RUN mv ./data/ /var/lib/postgresql/data/pg-data/

运行命令

docker run -p 5432:5432 -e PGDATA=/var/lib/postgresql/data/pg-data --name database-immage1 database-docker

1 个答案:

答案 0 :(得分:2)

如果您真的不需要使用数据库快照创建自定义映像,则可以使用卷。解压主机上某处的数据库文件~/pgdata,然后运行映像。示例:

docker run -v ~/pgdata:/var/lib/postgresql/data/ -p 5432:5432 postgres:9.5

文件必须与映像的postgres版本兼容,因此使用与存档数据库相同的映像版本。

如果相反,您必须重新创建不需要解压缩数据库归档文件的映像。 ADD指令将执行 为你。确保tar不包含任何前导目录。

Dockerfile

FROM postgres:latest
ADD ./postgres-data.tar.gz /var/lib/postgresql/data/

构建它:

docker build . -t database-docker

运行时不会覆盖环境变量PGDATA。请注意,您复制了/var/lib/postgresql/data中的文件,但是PGDATA指向/var/lib/postgresql/data/pg-data

运行容器:

docker run -p 5432:5432 --name  database-image1 database-docker