基于Google Cloud SDK镜像构建Docker时adduser命令执行失败
问题分析与解决方案
问题根源
gcr.io/google.com/cloudsdktool/google-cloud-cli:latest 基础镜像默认以非root的cloud-sdk用户运行,你编写的RUN命令会继承这个用户权限,而创建新用户、修改sudoers配置需要root权限,这就是导致adduser命令执行失败(exit code 2)的核心原因。
解决方案1:显式切回root执行用户配置
修改Dockerfile,在执行用户创建操作前显式切换回root:
FROM gcr.io/google.com/cloudsdktool/google-cloud-cli:latest # 切换回root权限执行后续敏感操作 USER root ARG USER=coder RUN adduser --disabled-password --gecos '' ${USER} && \ echo "${USER} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USER} && \ chmod 0440 /etc/sudoers.d/${USER} # 切换到自定义非root用户 USER ${USER} WORKDIR /home/${USER}
解决方案2:适配Alpine变体镜像
如果你的基础镜像实际是Alpine版本(比如使用带alpine标签的镜像),adduser命令参数与Debian/Ubuntu不同,还需要额外安装sudo:
FROM gcr.io/google.com/cloudsdktool/google-cloud-cli:alpine USER root ARG USER=coder RUN adduser -D -s /bin/sh ${USER} && \ echo "${USER} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USER} && \ chmod 0440 /etc/sudoers.d/${USER} && \ apk add --no-cache sudo USER ${USER} WORKDIR /home/${USER}
调试小技巧
- 临时添加命令确认当前用户和系统版本,排查环境问题:
RUN whoami && cat /etc/os-release
- 拆分
RUN命令,单独执行每一步,定位具体错误环节:
RUN adduser --disabled-password --gecos '' ${USER} RUN echo "${USER} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USER} RUN chmod 0440 /etc/sudoers.d/${USER}
内容的提问来源于stack exchange,提问作者quarks
相关产品推荐
相关产品推荐

