无法在Dockerfile中使用* RUN *执行* catkin *命令

时间:2019-05-01 19:53:36

标签: docker dockerfile ros catkin

我想在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 命令,因此在我的情况下使用它没有任何意义。因此,如果有人能指出正确的方法,我将不胜感激。

2 个答案:

答案 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