我有什么:
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update -y \
&& apt install -y --no-install-recommends \
sudo \
&& adduser --disabled-password --gecos "" --uid 1000 runner \
&& groupadd docker \
&& usermod -aG sudo runner \
&& usermod -aG docker runner \
&& echo "%sudo ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers
USER runner
RUN sudo usermod -u 1001 runner && sudo groupmod -g 121 runner
构建此 Dockerfile 会导致错误:
sudo:你不存在于密码数据库中
如果我将最后一个拆分RUN
成两个RUN
,则不会出现错误:
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update -y \
&& apt install -y --no-install-recommends \
sudo \
&& adduser --disabled-password --gecos "" --uid 1000 runner \
&& groupadd docker \
&& usermod -aG sudo runner \
&& usermod -aG docker runner \
&& echo "%sudo ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers
USER runner
RUN sudo usermod -u 1001 runner
RUN sudo groupmod -g 121 runner
为什么会发生这种情况?
答案1
在 中RUN sudo usermod -u 1001 runner && sudo groupmod -g 121 runner
,Dockersh
以用户身份启动一个进程runner
,运行这些命令。第一个命令会更改该用户的 UID。但该sh
进程仍使用旧 ID,因此,当它尝试运行第二个命令时,它会尝试使用数据库sudo
中不再存在的 UID运行passwd
。当您将它们拆分为两个命令时,Docker 会为第二个命令RUN
启动一个新进程,该进程使用新的 UID。sh
RUN
我没有解决方案,因为我不知道你为什么要这样做。我建议不要在以该用户身份运行进程时随机更改用户的 UID。sudo
并不是唯一不喜欢它的工具。
答案2
您可能希望将USER
语句放在所有RUN
语句之后,并sudo
从这些命令中删除。这样,对用户帐户的修改都将以 的形式发生root
,因此不会受到更改的影响。