如何以非root用户运行官方Docker PostgreSQL镜像?
问题:非root用户运行官方PostgreSQL Docker镜像启动失败
我尝试使用官方PostgreSQL Docker镜像(计划后续扩展),但以本地非root用户身份运行时,镜像无法启动:
- 按照基础指令执行时,服务正常启动:
docker run -e POSTGRES_PASSWORD=mysecretpassword postgres - 但按照官方文档“Arbitrary --user Notes”下的指令执行(无论是否添加
-it、--rm,或仅指定用户不指定组,结果一致):
会出现权限错误:docker run -it --rm --user "$(id -u):$(id -g)" -v /etc/passwd:/etc/passwd:ro -e POSTGRES_PASSWORD=mysecretpassword postgreschmod: changing permissions of '/var/lib/postgresql/data': Operation not permitted chmod: changing permissions of '/var/run/postgresql': Operation not permitted ... initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted
注:《Switching Between Root and Non-Root Users in Docker》内容已过时,《How to create a postgres container with a non-root user?》下的评论建议正是我当前尝试的操作。
解决方案
出现这个错误的核心原因是:官方PostgreSQL镜像中,/var/lib/postgresql/data和/var/run/postgresql目录默认属于容器内的postgres用户(UID为999),而你指定的本地非root用户没有权限修改这些目录的权限,启动时initdb执行chmod操作自然会失败。
你可以通过以下两种方式解决:
方式一:提前准备本地数据目录并设置正确权限
- 在本地创建数据目录:
mkdir -p ./postgres-data - 将目录权限设置为容器内
postgres用户可访问:sudo chown 999:999 ./postgres-data - 启动容器时挂载这个本地目录:
docker run -it --rm --user "$(id -u):$(id -g)" -v /etc/passwd:/etc/passwd:ro -v ./postgres-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword postgres
方式二:使用Docker管理的数据卷
Docker会自动处理数据卷的权限问题,无需手动调整:
- 创建Docker数据卷:
docker volume create postgres-data - 启动容器时挂载该数据卷:
docker run -it --rm --user "$(id -u):$(id -g)" -v /etc/passwd:/etc/passwd:ro -v postgres-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword postgres
需要注意的是,官方文档的“Arbitrary --user Notes”隐含了一个前提:你要么使用Docker管理的卷,要么已经确保挂载的本地目录有正确的权限,否则非root用户无法修改镜像自带目录的权限。
内容的提问来源于stack exchange,提问作者Richard Wheeldon
相关产品推荐
相关产品推荐

