如何在Dockerfile使用非root ubuntu用户时避免频繁调用chown命令
疑问1解答
如果基础镜像已经预设了ubuntu用户,执行RUN adduser --uid 1000 ubuntu属于完全冗余的操作,还可能引发构建失败:
- 如果基础镜像中ubuntu用户的UID不是1000,adduser命令会直接抛出「用户已存在」的错误,打断镜像构建流程
- 如果基础镜像中ubuntu用户的UID刚好为1000,这条命令不会生效,只会额外增加不必要的镜像层,没有任何实际价值
疑问2解答
不需要在Dockerfile中零散添加chown指令,有两种更简洁的实现方案:
方案1:提前批量创建目标目录并统一授权
在COPY操作执行前,先切换到root用户,一次性创建所有需要用到的父目录并统一赋予ubuntu用户权限,后续COPY时就不会生成root归属的隐式父目录:
# 临时切换到root用户创建目录并授权 USER root RUN mkdir -p /opt/app /opt/app/build && chown -R ubuntu:ubuntu /opt/app # 切换回默认的ubuntu用户 USER ubuntu # 后续COPY操作指定chown参数即可,无需再单独处理目录权限 COPY --chown=ubuntu:ubuntu . /opt/app WORKDIR /opt/app/build RUN cmake ..
方案2:使用BuildKit构建的目录挂载特性
Docker 18.09及以上版本默认启用BuildKit构建引擎,你可以使用挂载绑定的方式直接将代码拷贝到目标目录,自动继承目标目录的权限,无需额外配置chown:
# 开头指定Dockerfile语法版本,启用BuildKit特性 # syntax=docker/dockerfile:1.4 FROM 你的基础镜像 USER root RUN mkdir -p /opt/app && chown -R ubuntu:ubuntu /opt/app USER ubuntu WORKDIR /opt/app # 直接挂载本地代码到构建上下文,自动继承当前ubuntu用户权限 RUN --mount=type=bind,source=.,target=/opt/app \ mkdir build && cd build && cmake ..
内容的提问来源于stack exchange,提问作者Steven Lu
相关产品推荐
相关产品推荐

