You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dockerfile构建返回Code 2:添加非root用户失败排查求助

问题原因及解决方案

最可能的原因:目标目录不存在导致chown失败

你的修改版Dockerfile中,RUN adduser -D myuser && chown -R myuser /opt/app 这条命令执行时,/opt/app 目录还不存在。因为WORKDIR /opt/app是在这条RUN命令之后才执行的,Docker只有在处理WORKDIR指令时才会自动创建不存在的目录。因此chown命令找不到要修改权限的目录,直接报错退出,返回码为2。

其他可能的原因

  • 基础镜像用户管理命令不兼容:如果基础镜像不是Alpine系(比如Debian/Ubuntu),adduser -D的语法可能不适用。Debian系创建无密码用户需要使用adduser --system --no-create-home myuser这类参数,但这种情况导致的错误通常会指向adduser命令本身,而非后续的chown。
  • 非root用户执行RUN命令:极少数情况下,如果基础镜像默认启动用户不是root,执行adduser和chown会因权限不足失败,但官方OpenJDK镜像默认都是以root身份启动的,这种概率很低。

修复方案

方案1:先创建目录再修改权限

在RUN命令中显式创建/opt/app目录,确保chown时有可操作的目标:

FROM something/openjdk-17:1.13-1

RUN adduser -D myuser && mkdir -p /opt/app && chown -R myuser /opt/app
WORKDIR /opt/app

COPY ./build/libs/*.jar app.jar

USER myuser
CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

方案2:调整指令顺序,先设置WORKDIR

先通过WORKDIR创建目录,再执行chown命令:

FROM something/openjdk-17:1.13-1

WORKDIR /opt/app
RUN adduser -D myuser && chown -R myuser /opt/app

COPY ./build/libs/*.jar app.jar

USER myuser
CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

更优实践:COPY时直接指定所有者

Docker的COPY指令支持--chown参数,可以在复制文件时直接设置文件所有者,无需单独执行chown,更高效:

FROM something/openjdk-17:1.13-1

RUN adduser -D myuser
WORKDIR /opt/app

COPY --chown=myuser:myuser ./build/libs/*.jar app.jar

USER myuser
CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

内容的提问来源于stack exchange,提问作者asayke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:52:46