Что я имею:
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: you do not exist in the passwd database
Если я разделю последний RUN
на два RUN
s, ошибки нет:
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
Почему это происходит?
В RUN sudo usermod -u 1001 runner && sudo groupmod -g 121 runner
Docker запускает процесс sh
как пользователь runner
, запускающий эти команды. Первая команда изменяет UID этого пользователя. Но процесс sh
по-прежнему использует старый идентификатор, поэтому, когда он пытается запустить вторую команду, он пытается запустить sudo
с UID, которого больше нет в база данных passwd
. Когда вы разделяете их на две команды RUN
, Docker запускает новый процесс sh
для второго RUN
, который использует новый UID.
У меня нет решения для этого, так как я не знаю, почему вы делаете что-то подобное.Я бы посоветовал не изменять случайным образом UID пользователя при выполнении процессов от имени этого пользователя. sudo
- не единственный инструмент, которому он не понравится.