0

我觉得我进退两难了。我正在尝试创建一个 Dockerfile 来重现一个漫长而复杂的安装过程(ROS),这样我的学生就可以更轻松地运行它。

我正在结合提供的各种脚本以及记录的手动步骤。手动步骤通常说要执行“sudo”,但我被告知要避免在 Dockerfile 中执行 sudo。所以我将这些步骤移到 Dockerfile 中的 USER 命令之前,因为我被告知这些命令以 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
4

1 回答 1

1

我自己的信息会很有趣,以了解为什么sudo应该避免在容器中。

从历史上看,我们用于docker自动化团队中的构建、测试和部署流程,并且总是尝试Dockerfiles尽可能接近原始流程。

可以说,如果您在主机中构建了一些应用程序并启动了一些带有 的命令sudo,有些没有,我们设法创建了完全相同的Dockerfiles. 对此的积极反馈是,您不再有义务编写readme's如何构建代码 - 您只需提供Dockerfile并且每当有人想要在非容器环境中重复所有步骤时,他只需遵循(复制/粘贴)文件中的命令.

所以我的建议是 - 首先在 Dockerfile 中安装包,然后切换到用户并继续所有剩余的步骤,sudo必要时使用。您将拥有用户拥有的所有工件,而不是root.

UPD

得到了最初的讨论这个。因此,听起来您是根据您的特定情况和需求选择最佳方法。

于 2019-01-21T16:36:20.963 回答