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

问题描述 投票:2回答:2

我想在码头上使用定制的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命令不同,在我的情况下使用它是没有意义的。因此,如果有人能指出我这样做的正确方法,我将不胜感激。

docker dockerfile ros catkin
2个回答
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

3
投票

您的第二个案例将构建,因为CMD在构建期间未执行。它只是定义了启动容器时要执行的默认命令。有关更多信息,请参阅docker CMD docs

您的问题的根源是~/.bashrc未在RUN指令使用的shell中调用。因此,不存在环境变量以允许catkin_make或其他ros命令工作。我通过运行类似下面的命令在我的图像中解决了这个问题。

RUN . /opt/ros/kinetic/setup.sh && \
    catkin_make

您需要在需要这些环境变量的每个RUN指令中激活环境,因为shell不会在RUN命令之间重复使用。

编辑包括David Maze的改进。

© www.soinside.com 2019 - 2024. All rights reserved.