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

the*_*nov 4 postgresql docker

我想构建 postgres docker 容器来测试一些问题。我有:

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

  2. 将文件夹放入 docker postgres:latest 的 Dockerfile。

我想:

  1. 重新创建镜像后重置自身状态的 Docker 镜像。

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

  3. 我不想在/docker-entrypoint-initdb.d初始化脚本中等待很长时间的备份和恢复现有数据库的操作。

  4. 我不想使用卷,因为我不需要在重新启动之间存储新数据(这就是为什么这篇文章与如何将 PostgreSQL 容器与现有数据一起使用?不同的原因。在该文章中使用了卷)

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

但是 postgres docker 在 initdb 阶段执行时替换了这个文件。

如何询问 Postgres docker 不覆盖数据库文件?

例如 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/
Run Code Online (Sandbox Code Playgroud)

运行命令

docker run -p 5432:5432 -e PGDATA=/var/lib/postgresql/data/pg-data --name database-immage1 database-docker
Run Code Online (Sandbox Code Playgroud)

b0g*_*usb 5

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

docker run -v ~/pgdata:/var/lib/postgresql/data/ -p 5432:5432 postgres:9.5
Run Code Online (Sandbox Code Playgroud)

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

相反,如果您必须重新创建映像,则无需解压缩数据库存档。该ADD说明将为您做到这一点。确保 tar 不包含任何前导目录。

Dockerfile

FROM postgres:latest
ADD ./postgres-data.tar.gz /var/lib/postgresql/data/
Run Code Online (Sandbox Code Playgroud)

构建它:

docker build . -t database-docker
Run Code Online (Sandbox Code Playgroud)

运行时不覆盖环境变量PGDATA。请注意,您将文件复制到/var/lib/postgresql/dataPGDATA指向/var/lib/postgresql/data/pg-data.

运行容器:

docker run -p 5432:5432 --name  database-image1 database-docker
Run Code Online (Sandbox Code Playgroud)