Dockerfile设置USER root后,构建镜像仍提示‘need to be root’?
为什么Dockerfile设置了USER root,构建时仍提示权限不足?
问题重现
我的Dockerfile内容如下:
FROM percona/percona-xtradb-cluster-operator:0.3.0-proxysql USER root RUN chmod 0777 /var/lib/rpm/.dbenv.lock
执行docker build命令后,输出报错:
Sending build context to Docker daemon 128.9MB Step 1/4 : FROM percona/percona-xtradb-cluster-operator:0.3.0-proxysql # Executing 1 build trigger ---> Running in 5a04ebd04891 Loaded plugins: fastestmirror, ovl ovl: Error while doing RPMdb copy-up: [Errno 13] Permission denied: '/var/lib/rpm/.dbenv.lock' You need to be root to perform this command.
明明已经在Dockerfile里指定了USER root,为什么还是提示需要root权限?
原因分析
问题出在基础镜像的ONBUILD指令上:
- 你使用的
percona/percona-xtradb-cluster-operator:0.3.0-proxysql镜像内置了ONBUILD触发器,这些触发器会在你的Dockerfile执行FROM指令之后、后续所有指令(包括USER root)之前自动运行。 - 执行这些
ONBUILD指令时,使用的是基础镜像默认的非root用户,当触发器尝试操作需要root权限的/var/lib/rpm/.dbenv.lock文件时,就会触发权限拒绝错误。
解决方案
这里提供两种可行的解决思路:
1. 规避基础镜像的ONBUILD触发器
通过多阶段构建,先以root身份执行基础镜像的ONBUILD操作,再基于处理后的镜像继续构建:
# 第一阶段:以root身份执行基础镜像的ONBUILD指令 FROM percona/percona-xtradb-cluster-operator:0.3.0-proxysql AS base-builder USER root # 第二阶段:基于处理后的镜像构建最终镜像 FROM base-builder USER root RUN chmod 0777 /var/lib/rpm/.dbenv.lock # 添加你的其他构建指令
2. 创建去除ONBUILD触发器的自定义基础镜像
先手动处理基础镜像,移除其中的ONBUILD指令,再基于这个自定义镜像构建:
# 启动临时容器 docker run -d --name temp-proxysql percona/percona-xtradb-cluster-operator:0.3.0-proxysql sleep infinity # 提交容器为新镜像,清空ONBUILD指令 docker commit --change='ONBUILD []' temp-proxysql my-custom-proxysql-base # 删除临时容器 docker rm -f temp-proxysql
然后修改你的Dockerfile使用自定义镜像:
FROM my-custom-proxysql-base USER root RUN chmod 0777 /var/lib/rpm/.dbenv.lock
内容的提问来源于stack exchange,提问作者lklkxcxc
相关产品推荐
相关产品推荐

