如何向正在运行的PostgreSQL容器添加卷挂载?

5
我有一个正在运行的PostgreSQL Docker容器,并需要添加卷挂载。
我按照如何向现有Docker容器添加卷?中的步骤进行操作(对容器运行了docker commit以将其保存为镜像,并在此基础上启动了另一个容器,其中有一个命名的挂载卷)。第一个容器的所有数据文件现在都在第二个容器的/var/lib/postgres/data目录下。
然而,当我尝试查询这个第二个postgres数据库时,我看不到任何在第一个容器中的表。我已经尝试了几天来解决这个问题,但没有成功。我是否漏掉了什么(挂载卷是否会遮蔽原有的/var/lib/postgres/data中的数据)?
1个回答

3

由于Dockerfile中定义了,因此提交操作将无法正常工作。

卷在许多情况下非常有用,例如用于运行数据库存储。但是,由于卷不是容器的一部分,这使得容器不再具有可移植性,这似乎与“构建一次...随处运行”口号直接冲突。

使用VOLUME的数据容器进行docker提交

您可以尝试的一个选项是从现有容器中将数据文件夹复制到主机,然后使用挂载路径启动容器。

docker cp my_db_cotainer:/var/lib/postgresql/data  db_data

然后使用该路径启动一个新容器,以便它包含与先前容器相同的数据。
docker run -d --name some-postgres -v $PWD/db_data/:/var/lib/postgresql/data postgres

同样适用于mysql

docker cp some-mysql-old:/var/lib/mysql db_backup
docker run --rm --name some-mysql-new -v $PWD/db_backup:/var/lib/mysql  -it mysql

完美地运作了,非常感谢!但是我还不太清楚它是如何工作的。我看到Dockerfile中定义了volume,但是似乎我所做的和你建议的都将数据挂载到了/var/lib/postgresql/data目录下,这有什么区别呢? - L H
简单来说,卷不是Docker提交的一部分,因此当挂载目录时,它会隐藏Docker内部和主机文件中的内容。 - Adiii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接