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

Posted

技术标签:

【中文标题】如何将现有的 postgres 数据文件夹复制并使用到 docker postgres 容器中【英文标题】:How to copy and use existing postgres data folder into docker postgres container 【发布时间】:2019-09-03 10:58:22 【问题描述】:

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

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

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

我想要:

    重新创建映像后重置自身状态的 Docker 映像。

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

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

    我不想使用卷,因为我不需要在重启之间存储新数据(这就是这篇文章与 How to use a PostgreSQL container with existing data? 不同的原因。在那个帖子中使用了卷)

我的建议是在构建阶段将 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/

运行命令

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

【问题讨论】:

How to use a PostgreSQL container with existing data?的可能重复 和上个帖子链接不一样。在那篇文章中,他们使用 a) 卷 b) 对 db 进行转储和 c) 从转储中恢复。我不想要这一步,因为对于拥有自己的用户的 30 个数据库来说很乏味,并且转储它的速度不是那么快。我有一个带有数据库目录的存档,我必须在 docker 中替换它。他们在映像运行时恢复转储,我必须在容器构建时恢复转储,因为每次恢复容器时我都不必花费太多时间来恢复数据库 【参考方案1】:

如果您真的不需要使用数据库快照创建自定义映像,则可以使用卷。解压主机上某处的数据库文件~/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

【讨论】:

正如我所写的那样,我不想使用音量。我想在重新创建图像后留下所有额外的数据

以上是关于如何将现有的 postgres 数据文件夹复制并使用到 docker postgres 容器中的主要内容,如果未能解决你的问题,请参考以下文章

如何将现有的非文档核心数据存储转换为 uimanageddocument?

如何将现有的地理服务器独立应用程序迁移到 Web 存档?

如何手动将现有的配置文件和证书添加到 fastlane 匹配?

如何将现有的 Git 存储库导入另一个?

如何将现有的单例表视图数据保存在核心数据中?

如何将现有的非空目录转换为 Git 工作目录并将文件推送到远程存储库