如何迁移已创建的Docker PostGIS容器默认数据卷至指定位置?
迁移Docker PostGIS数据卷到指定位置的正确步骤
别慌,这个问题其实很常见,我来一步步给你讲清楚怎么操作,确保数据安全迁移,同时让外包承包商能轻松备份数据。核心思路是先停止容器避免数据损坏,然后把现有数据复制到你指定的新位置,最后用新的挂载方式重启容器。
第一步:停止运行中的PostGIS容器
首先必须停止容器,否则直接复制数据可能会导致数据不一致或损坏:
- 先找到你的容器ID或名称:
docker ps - 停止容器:
docker stop <container_id_or_name>
方案一:迁移到自定义本地目录(推荐给外包备份,路径明确易访问)
这个方案最适合给外包备份,因为你可以指定一个他们能访问的清晰路径,比如/opt/postgis-backup-data:
创建目标目录并设置正确权限
PostgreSQL在容器内用的是postgres用户(UID为999),所以必须确保目标目录的权限让这个用户能读写:sudo mkdir -p /opt/postgis-backup-data sudo chown 999:999 /opt/postgis-backup-data复制现有数据卷内容到新目录
用cp -a参数保留文件的权限和属性,这一步非常关键,否则容器启动会报错:sudo cp -a /var/lib/docker/volumes/[your_long_volume_id]/_data/. /opt/postgis-backup-data/注意把
[your_long_volume_id]替换成你实际的卷ID。删除旧容器(可选,如果你不需要保留旧容器)
docker rm <container_id_or_name>用新挂载目录启动PostGIS容器
这次启动时用-v参数把你刚创建的目录绑定到容器内的PostgreSQL数据目录:docker run -p 5435:5432 -e POSTGRES_PASSWORD=xxxxxxx -e POSTGRES_INITDB_ARGS="-d" -v /opt/postgis-backup-data:/var/lib/postgresql/data mdillon/postgis:9.6
方案二:创建命名数据卷(适合Docker生态内管理)
如果你更习惯用Docker的命名数据卷来管理(而不是直接用本地目录),可以用这个方案:
创建一个命名数据卷
docker volume create postgis-backup-volume用临时容器复制数据
我们用一个临时的busybox容器来安全复制旧卷的数据到新命名卷:docker run --rm -v [your_old_volume_id]:/old-data -v postgis-backup-volume:/new-data busybox cp -a /old-data/. /new-data/停止并删除旧容器,然后用新命名卷启动
docker stop <container_id_or_name> docker rm <container_id_or_name> docker run -p 5435:5432 -e POSTGRES_PASSWORD=xxxxxxx -e POSTGRES_INITDB_ARGS="-d" -v postgis-backup-volume:/var/lib/postgresql/data mdillon/postgis:9.6
关键验证步骤
启动新容器后,一定要验证数据是否完整:
psql -h localhost -p 5435 -U postgres
输入密码后,用\l查看数据库列表,或者查询你熟悉的表数据,确认所有内容都正常。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

