Владельцы и группы файлов Docker - PullRequest
0 голосов
/ 21 января 2019

Я думаю, у меня есть дилемма.Я пытаюсь создать Dockerfile, чтобы воспроизвести длительный и сложный процесс установки (ROS), чтобы мои ученики могли запустить его с меньшей головной болью.

Я комбинирую различные сценарии, снабженные ручными шагами, которые задокументированы.Шаги, выполняемые вручную, часто говорят «делать sudo», но мне говорят, что избегать выполнения sudo в Dockerfile.Поэтому я перехожу к этим шагам перед командой USER в Dockerfile, потому что мне сказали, что эти команды выполняются от имени пользователя root.Однако в результате созданные файлы и каталоги принадлежат пользователю root, и я полагаю, что последующие шаги не удаются.

У меня есть два варианта: переместить команды после команды USER и включить sudo или попытаться сделать командуСценарии установки создают каталоги и файлы с правами собственности.Конечно, априори я не знаю, какие файлы и каталоги будут созданы.

Вот мой Dockerfile (фактически один из многих, с которыми я экспериментировал). Также, если вы видите какие-то другие вещи, которые нужноулучшено или исправлено, пожалуйста, дайте мне знать!

FROM ubuntu:16.04

# 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

RUN apt-get update && apt-get install --assume-yes wget sudo && \
wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_kinetic.sh && \
chmod 755 ./install_ros_kinetic.sh && \
bash ./install_ros_kinetic.sh

RUN  apt-get install --assume-yes ros-kinetic-joy ros-kinetic-teleop-twist-joy ros-kinetic-teleop-twist-keyboard ros-kinetic-laser-proc ros-kinetic-rgbd-launch ros-kinetic-depthimage-to-laserscan ros-kinetic-rosserial-arduino ros-kinetic-rosserial-python ros-kinetic-rosserial-server ros-kinetic-rosserial-client ros-kinetic-rosserial-msgs ros-kinetic-amcl ros-kinetic-map-server ros-kinetic-move-base ros-kinetic-urdf ros-kinetic-xacro ros-kinetic-compressed-image-transport ros-kinetic-rqt-image-view ros-kinetic-gmapping ros-kinetic-navigation ros-kinetic-interactive-markers

USER $USERNAME
WORKDIR /home/$USERNAME

RUN cd /home/$USERNAME/catkin_ws/src/ && \
  git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git && \
  git clone https://github.com/ROBOTIS-GIT/turtlebot3.git && \
  git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git


# add catkin env
RUN echo 'source /opt/ros/kinetic/setup.bash' >> /home/$USERNAME/.bashrc
RUN echo 'source /home/ros/catkin_ws/devel/setup.bash' >> /home/$USERNAME/.bashrc
# RUN . /home/ros/.bashrc && \ 
#      cd /home/$USERNAME/catkin_ws && \
#      catkin_make

USER $USERNAME
ENTRYPOINT /bin/bash

1 Ответ

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

Мне было бы интересно узнать, почему в контейнерах следует избегать sudo.

Исторически мы использовали docker для автоматизации процессов сборки, тестирования и развертывания в нашей команде и всегда старались написать Dockerfiles как можно ближе к исходному процессу.

Допустим, если вы создаете в своем хосте какое-то приложение и запускаете некоторые команды с sudo, некоторые без, нам удалось создать точно такой же Dockerfiles. Положительная обратная связь с этим заключается в том, что вы больше не обязаны писать readme's о том, как создавать код - вы просто указываете Dockerfile, и когда кто-то хочет повторить все шаги в неконтейнерной среде, он просто следует (copy / Вставить) команды из файла.

Итак, мое предложение - сначала установите пакеты в Dockerfile, затем переключитесь на пользователя и выполните все остальные шаги, используя sudo при необходимости. У вас будут все артефакты, принадлежащие пользователю, а не root.

UPD

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

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