具有初始数据的docker postgres不会持久保留

Vin*_* V. 16 postgresql ruby-on-rails docker

我在docker环境中创建了一个rails应用程序,它链接到postgres实例.我编辑了postgres容器以添加初始数据(通过从rails应用程序运行rake db:setup).现在我提交了postgres数据库,但是当我创建一个新的容器(提交的postgres图像)时,它似乎不记得我的数据.

是不是可以在提交中保存数据然后再重复使用它?

我使用了postgres图像:https://registry.hub.docker.com/_/postgres/

Adr*_*uat 19

问题是postgres Dockerfile将"/ var/lib/postgresql/data"声明为卷.这只是一个普通的目录,它位于图像使用的Union File System之外.卷直到没有容器链接到它们并且它们被明确删除.

你有几个选择:

  • 使用该--volumes-from命令与新容器共享数据.这只有在一次只有一个正在运行的postgres图像时才有效,但这是最好的解决方案.
  • 编写自己的Dockerfile,在声明卷之前创建数据.创建容器后,此数据将被复制到卷中.
  • 编写一个入口点或cmd脚本,在运行时填充数据库.

所有这些建议都要求您在容器运行后使用Volumes来管理数据.或者,您可以编写自己的Dockerfile,而不是声明卷.然后,您可以docker commit在添加数据后用于创建新图像.这可能会在短期内起作用,但绝对不是你应该如何使用容器 - 它不可重复,你最终会在联盟文件系统中用完图层.

查看有关管理容器中数据的官方Docker文档以获取更多信息.


mat*_*tes 8

创建一个新的Dockerfile并更改PGDATA

FROM postgres:9.2.10

RUN mkdir -p /var/lib/postgresql-static/data
ENV PGDATA /var/lib/postgresql-static/data
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么会这样,但它很神奇。谢谢 (2认同)

abb*_*bas 8

您应该已使用以下命令完成设置。最重要的部分是 PGDATA 位置,它不应该是默认位置。

docker run -e PGDATA=/var/lib/postgresql/pgdata -e POSTGRES_PASSWORD=YourPa$$W0rd -d postgres
Run Code Online (Sandbox Code Playgroud)

  • 这就是OP想要的。 (3认同)
  • @LukasSalich 这个“有点”回答了问题。如果使用此命令行运行容器,则数据将存储在 dockerfile 中声明的卷之外(即“/var/lib/postgresql/data”)。这意味着,一旦您用数据填充此类数据库,然后使用“docker commit”拍摄快照,数据将成为已提交映像的一部分。如果您使用此映像运行另一个容器(甚至在另一个主机上),则数据将从一开始就在那里。 (2认同)