@Gustov

Как правильно добавить non-root userа в multistage Dockerfile?

Сделал следующий Dockerfile

FROM ubuntu:20.04@sha256:dcc176d1ab45d154b767be03c703a35fe0df16cfb1cc7ea5dd3b6f9af99b6718 AS gitcode
ARG USERNAME=someuser
ARG USER_UID=782
ARG USER_GID=$USER_UID

RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& apt-get update \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME \
&& apt-get install git -y \
&& git clone https://github.com/jenkins-docs/simple-java-maven-...

FROM maven:3.8-jdk-11@sha256:4c5742fa41cdeea437e22332db82f5e397acf400374d339f8166053badb80f04 AS build
WORKDIR /usr/src/app
COPY --from=gitcode simple-java-maven-app .
RUN mvn clean package

FROM gcr.io/distroless/java
COPY --from=build /usr/src/app/target/*.jar /usr/app/*.jar
ENTRYPOINT ["java","-jar","/usr/app/*.jar"]

USER $USERNAME

но как бы я не старался с разными комбинациями, мне не удается запустить контейнер от имени пользователя someuser

docker run -it -u someuser image:v1, все время получаю ошибку
docker: Error response from daemon: unable to find user someuser: no matching entries in passwd file.

При этом, если собирать не multistage Dockerfile, то добавление non-root userа и запуск от его имени проходит на ура. Возможно не учитываю какую-нибудь особенность?
  • Вопрос задан
  • 225 просмотров
Решения вопроса 1
@codeIvy
Привет!
Юзер созданный на первом шаге мультибилда не переносится в последний, в котором ты копируешь бинарь в дистролес-имедж.
Скопируй /etc/passwd из gitcode-шага в финальный слой и все должно заработать.
Как-то так:
FROM gcr.io/distroless/java
COPY --from=build /usr/src/app/target/*.jar /usr/app/*.jar
COPY --from=gitcode /etc/passwd /etc/passwd
ENTRYPOINT ["java","-jar","/usr/app/*.jar"]

USER $USERNAME
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы