У меня был рабочий 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
В чем может быть проблема?
Лучший способ отладки подобных проблем — сначала запустить необработанный образ с подключенным терминалом, а затем выполнять шаги вручную, пока не добьетесь правильного результата.





3 проблемы в вашем Dockerfile:
WORKDIR /opt/app перед chownuseradd вместо addusertrmonbs, но использовали 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 правами, как это сделать?
Я добавил в сообщение мой пользователь с правами root, пожалуйста, используйте «RUN useradd -r -g root myuser && chown -R myuser:root /opt/app»
К сожалению, в разрешении по-прежнему отказано :(
В любом случае, получаю «невозможно заблокировать /etc/passwd»
(На самом деле вам не нужен
chownкаталог. Это нормально, если пользователь среды выполнения контейнера не может писать в текущий каталог, и, вероятно, хорошей практикой является предотвращение случайной перезаписи кода в контейнере.)