Почему простой Dockerfile дает разрешение «отказано»? - PullRequest
0 голосов
/ 19 января 2019

Я учусь использовать Docker с ROS, и меня удивляет это сообщение об ошибке:

FROM ros:kinetic-robot-xenial

# create non-root user
ENV USERNAME ros
RUN adduser --ingroup sudo --disabled-password --gecos "" --shell /bin/bash --home /home/$USERNAME $USERNAME
RUN bash -c 'echo $USERNAME:ros | chpasswd'
ENV HOME /home/$USERNAME
USER $USERNAME

RUN apt-get update

Дает это сообщение об ошибке

Step 7/7 : RUN apt-get update
 ---> Running in 95c40d1faadc
Reading package lists...
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
The command '/bin/sh -c apt-get update' returned a non-zero code: 100

Ответы [ 3 ]

0 голосов
/ 19 января 2019

apt-get обычно нужно запускать от имени пользователя root, но после запуска команды USER команды больше не запускаются от имени пользователя root.

Вы часто будете запускать такие команды при запуске Dockerfile: если вы хотите, вы можете воспользоваться преимуществами кэширования слоя Docker, и вы, как правило, будете устанавливать зависимости в остальной части Dockerfile. необходимо. Также по причинам кэширования слоев важно запускать apt-get update и другие этапы установки за один шаг. Таким образом, ваш Dockerfile будет выглядеть как

FROM ros:kinetic-robot-xenial
# Still root
RUN apt-get update \
 && apt-get install ...
# Copy in application (still as root, won't be writable by other users)
COPY ...
CMD ["..."]
# Now as the last step create a user and default to running as it
RUN adduser ros
USER ros

Если вам нужно, вы можете явно USER root переключиться обратно на root для последующих команд, но обычно легче читать и поддерживать файлы Docker с меньшим количеством пользовательских переключений.

Также обратите внимание, что ни sudo, ни пользовательские пароли действительно бесполезны в Docker. В общем, сложно запустить sudo в сценарии, и в сценариях происходит много вещей с Docker. Контейнеры также почти никогда не запускают такие вещи, как getty или sshd, которые потенциально могут принимать пользовательские пароли, и их тривиально читать из docker history, поэтому нет смысла их устанавливать. И наоборот, если вы можете получить оболочку в контейнере, вы всегда можете передать -u root команде docker run или docker exec, чтобы получить корневую оболочку.

0 голосов
/ 19 января 2019

Попробуйте поместить эту строку в конец вашего dockerfile

USER $ USERNAME (как только эта строка появится в dockerfile ... вы примете права этого пользователя ... которые в этом случае устанавливать не нужноничего) по умолчанию вы root

0 голосов
/ 19 января 2019

Вы добавляете пользователя ros в группу sudo, но пытаетесь apt-get update без использования sudo. Поэтому вы запускаете команду непривилегированным и получаете permission denied.

Используйте команду "Выполнить" (t):

FROM ros:kinetic-robot-xenial

RUN whoami
RUN apt-get update
# create non-root user
RUN apt-get install sudo
RUN echo "ros ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers
ENV USERNAME ros 
RUN adduser --ingroup sudo --disabled-password --gecos "" --shell /bin/bash --home /home/$USERNAME $USERNAME
RUN bash -c 'echo $USERNAME:ros | chpasswd'
ENV HOME /home/$USERNAME
USER $USERNAME

RUN whoami
RUN sudo apt-get update

В целом, это не имеет особого смысла. Можно подготовить образ докера (например, установить программное обеспечение и т. Д.) С правами пользователя root. Если вы беспокоитесь о безопасности (что хорошо), оставьте вещи sudo и убедитесь, что процесс (ы), которые запускаются при запуске образа (например, создается контейнер) с вашим непривилегированным пользователем ...

Также рассмотрите многоэтапные сборки, если вы хотите отделить подготовку образа от фактической работоспособной вещи:

https://docs.docker.com/develop/develop-images/multistage-build/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...