我想在码头上使用定制的ros-indigo。我准备了以下Dockerfile
FROM ros:indigo-robot
RUN echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
RUN mkdir -p /home/catkin_ws/src
WORKDIR /home/catkin_ws/src
RUN catkin_init_workspace
WORKDIR /home/catkin_ws
RUN catkin_make
RUN echo "source /home/catkin_ws/devel/setup.bash" >> ~/.bashrc
但是,它在RUN catkin_init_workspace和RUN catkin_make上都会出现错误
/bin/sh: catkin_make: command not found
The command '/bin/sh -c catkin_init_workspace' returned a non-zero code: 127
令人惊讶的是,如果我使用CMD为catkin命令更改RUN,它会成功构建,即以下Dockerfile构建得很好
RUN echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
RUN mkdir -p /home/catkin_ws/src
WORKDIR /home/catkin_ws/src
CMD catkin_init_workspace
WORKDIR /home/catkin_ws
CMD catkin_make
RUN echo "source /home/catkin_ws/devel/setup.bash" >> ~/.bashrc
更令人惊讶的是,这些catkin命令完美地适用于在任何ros-indigo图像上单独构建的容器。
这清楚地表明RUN不是调用catkin命令的合适方式,或者我错误地调用它。
现在,鉴于CMD命令的性质与RUN命令不同,在我的情况下使用它是没有意义的。因此,如果有人能指出我这样做的正确方法,我将不胜感激。
您需要为命令设置适当的bash环境(默认情况下,Docker使用sh来执行命令)。这些命令对我有用:
FROM ros:indigo-robot
RUN echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
RUN mkdir -p /home/catkin_ws/src
WORKDIR /home/catkin_ws/src
#RUN /opt/ros/indigo/bin/catkin_init_workspace
RUN /bin/bash -c '. /opt/ros/indigo/setup.bash; catkin_init_workspace /home/catkin_ws/src'
WORKDIR /home/catkin_ws
RUN /bin/bash -c '. /opt/ros/indigo/setup.bash; cd /home/catkin_ws; catkin_make'
RUN echo "source /home/catkin_ws/devel/setup.bash" >> ~/.bashrc
您的第二个案例将构建,因为CMD
在构建期间未执行。它只是定义了启动容器时要执行的默认命令。有关更多信息,请参阅docker CMD docs。
您的问题的根源是~/.bashrc
未在RUN
指令使用的shell中调用。因此,不存在环境变量以允许catkin_make
或其他ros命令工作。我通过运行类似下面的命令在我的图像中解决了这个问题。
RUN . /opt/ros/kinetic/setup.sh && \
catkin_make
您需要在需要这些环境变量的每个RUN
指令中激活环境,因为shell不会在RUN
命令之间重复使用。
编辑包括David Maze的改进。