gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:49:27 27 4
gpt4 key购买 nike

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

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

  2. 将文件夹放入 docker 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/ 中构建阶段。

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

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

例如文件

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

最佳答案

如果您真的不需要使用数据库快照创建自定义镜像,您可以使用卷。解压主机某处的数据库文件说 ~/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/dataPGDATA 指向 /var/lib/postgresql/data/pg-data.

运行容器:

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

关于postgresql - 如何将现有的 postgres 数据文件夹复制和使用到 docker postgres 容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57770303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com