Невозможно выполнить команды * catkin *, используя * RUN * в Dockerfile - PullRequest
2 голосов
/ 01 мая 2019

Я хочу использовать настроенную рос-индиго на докере.Я подготовил следующий файл 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

Удивительно, но он успешно собирается, если я изменяю RUN с помощью CMD для catkin команд, то есть следующий 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 ]

3 голосов
/ 02 мая 2019

Ваш второй случай будет построен, потому что CMD не выполняется во время сборки. Он просто определяет команду по умолчанию для выполнения при запуске контейнера. См. Докер CMD docs для получения дополнительной информации.

Корень вашей проблемы в том, что ~/.bashrc не вызывается в оболочке, используемой инструкцией RUN. В результате переменные окружения отсутствуют, чтобы позволить catkin_make или другим командам ros работать. Я решаю эту проблему в своих изображениях, выполнив команду, подобную приведенной ниже.

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

Вам необходимо будет активировать среду в каждой инструкции RUN, для которой нужны эти переменные среды, поскольку оболочка не используется повторно между командами RUN.

Отредактировано, чтобы включить улучшение от David Maze.

1 голос
/ 02 мая 2019

Вам необходимо настроить правильную среду 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
...