我想在docker上使用自定义的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
令人惊讶的是,如果我用 catkin 命令的 CMD 更改 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 命令,因此在我的情况下使用它没有任何意义。因此,如果有人能指出正确的方法,我将不胜感激。
答案 0 :(得分:3)
您的第二种情况将被构建,因为在构建期间未执行CMD
。它仅定义启动容器时要执行的默认命令。有关更多信息,请参见docker CMD docs。
问题的根源是~/.bashrc
指令所使用的shell中没有调用RUN
。结果,不存在环境变量以允许catkin_make
或其他ros命令起作用。通过运行类似于以下内容的命令,我在图像中解决了此问题。
RUN . /opt/ros/kinetic/setup.sh && \
catkin_make
您将需要在每个需要这些环境变量的RUN
指令中激活环境,因为在RUN
命令之间不会重复使用外壳程序。
经过编辑,包含了David Maze的改进。
答案 1 :(得分:1)
您需要为命令运行设置适当的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