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

Docker构建镜像创建用户时adduser参数歧义报错解决方法

问题产生原因
  • 你使用的运行时基础镜像adoptopenjdk/openjdk11:x86_64-debianslim-jre-11.0.15_10属于Debian发行版,内置的adduser/addgroup是Debian专属的adduser工具链实现,和Alpine镜像中BusyBox提供的精简版adduser参数规则不兼容。你写的-S(创建系统用户短参数)、-s(指定shell短参数)、-G(指定用户组短参数)都是BusyBox版adduser的参数,Debian版adduser的短参数存在多选项匹配冲突:比如-s同时匹配--shell和--system两个选项,-g开头的参数同时匹配--gecos/--gid/--group三个选项,直接触发参数歧义报错,导致命令执行失败。
  • 现有Dockerfile还存在隐藏的路径配置错误:你创建的应用存放目录是/application,但后续修改权限的命令写的是chown -R javauser:javauser /app,/app路径根本不存在,即使用户创建步骤成功,后续javauser用户也会因为/application目录权限归属root,没有操作权限导致服务启动失败。
修复方法

将创建用户的命令替换为Debian兼容的长参数写法,同时修正权限配置的路径错误,修正后的完整Dockerfile如下:

FROM maven:3.8.5-jdk-11-slim AS build_step
RUN mkdir /backend
COPY . /backend
WORKDIR /backend
RUN mvn clean package -DskipTests

FROM adoptopenjdk/openjdk11:x86_64-debianslim-jre-11.0.15_10
RUN mkdir /application
# 使用Debian adduser兼容的长参数创建系统用户
RUN addgroup --system javauser && adduser --system --shell /bin/false --ingroup javauser javauser
COPY --from=build_step /backend/target/my-java-app-0.0.1-SNAPSHOT.jar /application
WORKDIR /application
# 修正权限路径为实际的应用目录
RUN chown -R javauser:javauser /application
USER javauser
CMD ["java", "-jar", "my-java-app-0.0.1-SNAPSHOT.jar"]

核心修改点:

  • 创建用户时弃用BusyBox专属短参数,改用Debian工具支持的明确长参数:用--system替代-S标记系统用户,用--shell /bin/false替代-s /bin/false禁止用户登录,用--ingroup javauser替代-G javauser指定用户所属主组,彻底解决参数歧义问题。
  • 将chown命令的错误路径/app改为实际存放应用的/application,保证普通用户对应用目录有完整操作权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:21:42