如何清除Docker中含已创建用户、数据库的全部PostgreSQL残留数据
根本原因
- 你旧PostgreSQL容器使用的是宿主机本地路径
/data的bind mount存储数据,并非Docker自主管理的命名卷。 docker system prune仅会清理Docker管控范围内的资源(悬空镜像、已停止的容器、无容器引用的命名卷、闲置网络),完全不会修改/删除宿主机本地目录下的文件。- 旧PostgreSQL的全部数据(包括
oldadmin角色、oldDB数据库)完整保留在宿主机/data目录中。新启动的newpostgresqldb容器直接挂载到这个已初始化完成的旧数据目录,PostgreSQL服务启动时会直接加载已有数据的配置,完全忽略新传入的POSTGRES_USER=newadmin环境变量,因此会报role "newadmin" does not exist的错误。
操作步骤
- 停止并删除当前残留的新容器
docker stop newpostgresqldb && docker rm newpostgresqldb - 清空宿主机
/data目录内的旧PostgreSQL数据(操作前可先查看目录内容,确认无其他需要保留的文件后再执行删除)rm -rf /data/* - 重新启动新的PostgreSQL容器。由于当前挂载的
/data是空目录,容器首次启动时会按照配置的环境变量完成数据库初始化,自动创建newadmin超级用户docker run --name newpostgresqldb -e POSTGRES_USER=newadmin -e POSTGRES_PASSWORD=secret -p 5432:5432 -v /data:/var/lib/postgresql/data -d postgres - 等待10-20秒待容器初始化完成后,即可正常执行数据库创建命令
docker exec -i newpostgresqldb psql -U newadmin -c "CREATE DATABASE newDB WITH ENCODING='UTF8' OWNER=newadmin;"
实用提示:后续可将bind mount替换为Docker管理的命名卷存储PG数据,执行
docker system prune --volumes时这类资源会被自动清理,避免手动清空宿主机目录的操作。比如将启动命令中的-v /data:/var/lib/postgresql/data替换为-v pg_new_data:/var/lib/postgresql/data即可。
内容的提问来源于stack exchange,提问作者Pechenko
相关产品推荐
相关产品推荐

