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
相关产品推荐
相关产品推荐

