在docker提交后容器中的更改不持久



我创建了一个容器:

docker run --name mypostgres 
--publish 5432:5432 
--net=apinetwork 
-e POSTGRES_PASSWORD=pwd 
-e POSTGRES_DB=db_uso 
-d postgres

我连接数据库并创建一些表和对象…

在此之后我提交;

docker commit mypostgres user/mypostgres

但当我创建其他容器从这个形象:

docker run --name mypostgres2 
--publish 5432:5432 
--net=apinetwork 
-e POSTGRES_PASSWORD=mysecretpassword 
-e POSTGRES_DB=correntista 
-d user/mypostgres

我看不出我的对象,我创建了内部!

请帮帮我。

您很可能没有看到更改,因为使用原始容器创建的卷没有被新容器使用。

参见持久化DB Docker教程


您需要显式地创建一个卷,并确保它正在新容器中使用。

$ docker volume create my-pg-db
$ docker run --name mypostgres 
--publish 5432:5432 
--net=apinetwork 
-v my-pg-db:/var/lib/postgresql/data 
-e POSTGRES_PASSWORD=pwd 
-e POSTGRES_DB=db_uso 
-d postgres

这意味着如果您所做的所有更改都在DB上,则可能甚至不需要制作容器的副本。包含DB的卷是您需要保存的!

当你想要启动容器时,确保你挂载并使用它。

数据不被持久化的原因在另一个SO问题中解释:

带初始数据的docker postgres在提交时不会被持久化

问题是postgres Dockerfile声明"/var/lib/postgresql/data"作为一卷。这只是一个普通目录,位于映像使用的联合文件系统之外。卷一直存在,直到没有容器链接到它们,并且它们被显式删除。

这就是为什么你需要外部管理的卷,比如@smac90。

来源:https://github.com/docker-library/postgres/blob/5c0e796bb660f0ae42ae8bf084470f13417b8d63/Dockerfile-debian.template L186

最新更新