sudo:你不存在于密码数据库中

sudo:你不存在于密码数据库中

我有什么

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。shRUN

我没有解决方案,因为我不知道你为什么要这样做。我建议不要在以该用户身份运行进程时随机更改用户的 UID。sudo并不是唯一不喜欢它的工具。

答案2

您可能希望将USER语句放在所有RUN语句之后,并sudo从这些命令中删除。这样,对用户帐户的修改都将以 的形式发生root,因此不会受到更改的影响。

相关内容