dockerpostgres与初始数据不会持久提交

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

难道没有可能将数据保存在提交中,然后再使用它?

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

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

你有几个select:

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

所有这些build议都要求您在容器运行后使用卷来pipe理数据。 另外,你可以编写你自己的Dockerfile,而不需要声明一个卷。 然后你可以使用docker commit来添加数据后创build一个新的图像。 这可能会在短期内起作用,但绝对不是你应该如何使用容器 – 这是不可重复的,你最终会在联盟文件系统中失去层次。

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

创build一个新的Dockerfile并更改PGDATA

 FROM postgres:9.2.10 RUN mkdir -p /var/lib/postgresql-static/data ENV PGDATA /var/lib/postgresql-static/data 

在提交过程中不能保存数据,因为数据驻留在特定于该容器的装载上,一旦运行docker rm <container ID>就会被移除,但是可以使用数据卷在容器和容器之间共享和重新使用数据所做的更改直接在音量上进行。

您可以使用docker run -v /host/path:/Container/path将卷挂载到新容器。

请参考: https : //docs.docker.com/userguide/dockervolumes/