我创建了一个容器:
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