Получение кода 2 при сборке с помощью dockerfile

У меня был рабочий dockerfile, но я хотел его обновить, чтобы контейнер не запускался от пользователя root. Вот первоначальная версия файла docker:

FROM something/openjdk-17:1.13-1

WORKDIR /opt/app

COPY ./build/libs/*.jar app.jar

CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

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

FROM something/openjdk-17:1.13-1

RUN adduser -D myuser && chown -R myuser /opt/app
WORKDIR /opt/app

COPY ./build/libs/*.jar app.jar

USER myuser
CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

Однако я получил:

The command '/bin/sh -c adduser -D myuser && chown -R myuser /opt/app' returned a non-zero code: 2
Process exited with code 2

В чем может быть проблема?

(На самом деле вам не нужен chown каталог. Это нормально, если пользователь среды выполнения контейнера не может писать в текущий каталог, и, вероятно, хорошей практикой является предотвращение случайной перезаписи кода в контейнере.)

David Maze 04.07.2024 17:37

Лучший способ отладки подобных проблем — сначала запустить необработанный образ с подключенным терминалом, а затем выполнять шаги вручную, пока не добьетесь правильного результата.

jurez 04.07.2024 18:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

3 проблемы в вашем Dockerfile:

  • Попытка дать разрешение перед созданием каталога (opt/app). Пожалуйста, переместите WORKDIR /opt/app перед chown
  • Пожалуйста, используйте useradd вместо adduser
  • Пожалуйста, будьте осторожны с тем, какого пользователя вы добавляете (вы добавили trmonbs, но использовали myuser)

Пример (Dockerfile):

FROM openjdk:11

WORKDIR /opt/app

RUN useradd -r myuser && chown -R myuser /opt/app

COPY *.jar app.jar

USER myuser

CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

Создание myuser с root правами:

RUN useradd -r -g root myuser && chown -R myuser:root /opt/app

Выход:

PC:~/javatest$ docker build -t testjdk .
Sending build context to Docker daemon  6.656kB
Step 1/6 : FROM openjdk:11
 ---> 47a932d998b7
Step 2/6 : WORKDIR /opt/app
 ---> Running in eaad102b776e
Removing intermediate container eaad102b776e
 ---> 1937a6e2eed8
Step 3/6 : RUN useradd -r myuser && chown -R myuser /opt/app
 ---> Running in fc0d7c5ebc1d
Removing intermediate container fc0d7c5ebc1d
 ---> 56ddcf8fbbb4
Step 4/6 : COPY *.jar app.jar
 ---> 9004394fd9d9
Step 5/6 : USER myuser
 ---> Running in ae35fb0fc285
Removing intermediate container ae35fb0fc285
 ---> 797ee3ec3215
Step 6/6 : CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar
 ---> Running in e5f3814f11a7
Removing intermediate container e5f3814f11a7
 ---> 676d4cdc37d8
Successfully built 676d4cdc37d8
Successfully tagged testjdk:latest
PC:~/javatest$ docker run testjdk
My Java App

Вывод 2 (чтобы проверить, есть ли у него права root или нет, после добавления myuser с правами root):

PC:~/javatest$ docker run -it --rm testjdk2 bash -c 'id && exec bash'
uid=999(myuser) gid=0(root) groups=0(root)
myuser@b9a82e60eff2:/opt/app$ 

Спасибо! Но теперь я получаю «отказано в доступе» (код 1) в той же строке, где раньше был код 2. Я так понимаю, что мне нужно создать пользователя с root правами, как это сделать?

asayke 04.07.2024 17:56

Я добавил в сообщение мой пользователь с правами root, пожалуйста, используйте «RUN useradd -r -g root myuser && chown -R myuser:root /opt/app»

Ömer Sezer 04.07.2024 18:05

К сожалению, в разрешении по-прежнему отказано :(

asayke 04.07.2024 18:34

В любом случае, получаю «невозможно заблокировать /etc/passwd»

asayke 04.07.2024 18:54

Другие вопросы по теме