Environment Setup
Opened this issue · 2 comments
I'm struggling to get a Dockerfile set up with my custom workspace code built and colcon environment automatically configured for a user to "enter" without needing any extra source
calls.
In my Dockerfile, I have the following (psuedo) sections:
-
I have a layer that installs
ros-foxy-ros-core=0.9.2-1*
in much the same way the official ROS Docker images do. -
From (1), I have a layer that sources the ROS workspace and then builds both
orocos-toolchain
andrtt_ros2_integration
from source, in much the same way that the official Orocos Docker images do. The goods of that layer include:
RUN echo "yaml file:///etc/ros/rosdep/orocos-prereqs.yaml" > /etc/ros/rosdep/sources.list.d/10-orocos-prereqs.list && \
mkdir -p /root/orocos_ws && \
vcs import --recursive /root/orocos_ws < /root/orocos_ws/orocos_toolchain.repos && \
# start temporary fix for broken build (https://github.com/orocos-toolchain/orogen/pull/140)
cd /root/orocos_ws/orocos_toolchain/orogen && \
git checkout metaruby-rosdep-in-manifest-xml && \
# end temporary fix for broken build (https://github.com/orocos-toolchain/orogen/pull/140)
cd /root/orocos_ws/orocos_toolchain && \
source /opt/ros/${ROS_DISTRO}/local_setup.sh && \
apt-get update && \
apt-get install -y \
ruby \
&& \
rosdep update && \
rosdep install -y --from-path . --ignore-src && \
MAKEFLAGS="${MAKEFLAGS}" \
colcon build \
--event-handlers console_direct+ \
--install-base /opt/orocos/${ROS_DISTRO} \
--merge-install \
--cmake-args \
\ -DBUILD_TESTING=OFF \
\ -DCMAKE_BUILD_TYPE=Release \
\ -DENABLE_CORBA=ON \
\ -DCORBA_IMPLEMENTATION=OMNIORB \
\ -DOROCOS_INSTALL_INTO_PREFIX_ROOT=ON \
${COLCON_ARGS} && \
mkdir -p /root/orocos_integration_ws/src && \
vcs import --recursive /root/orocos_integration_ws/src < /root/orocos_integration_ws/orocos_ros2_integration.repos && \
cd /root/orocos_integration_ws && \
source /opt/ros/${ROS_DISTRO}/setup.sh && \
source /opt/orocos/${ROS_DISTRO}/local_setup.sh && \
# ignore the tests, apparently...
touch src/rtt_ros2_integration/tests/COLCON_IGNORE && \
ROS_PACKAGE_PATH=/opt/orocos/${ROS_DISTRO}/share:/opt/ros/${ROS_DISTRO}/share \
rosdep install -y --from-path . --ignore-src && \
MAKEFLAGS="${MAKEFLAGS}" \
colcon build \
--event-handlers console_direct+ \
--install-base /opt/orocos/${ROS_DISTRO} \
--merge-install \
--cmake-args \
\ -DBUILD_TESTING=OFF \
\ -DCMAKE_BUILD_TYPE=Release \
${COLCON_ARGS} &&\
cd /root && \
rm -rf /root/orocos_ws && \
rm -rf /root/orocos_integration_ws && \
rm -rf /var/lib/apt/lists/*
- From (2), I have have a layer that sources the Orocos workspace and then builds my custom workspace. The goods of that layer include:
RUN cd /root/custom_ws && \
source /opt/orocos/${ROS_DISTRO}/setup.sh && \
colcon build --parallel-workers ${BUILD_JOBS}
- And finally, I have a .bashrc file that does get automatically sourced (because I see
echo
s from it in testing), that includes:
if [ -f ~/custom_ws/install/setup.bash ]; then
source ~/custom_ws/install/setup.bash
echo "SOURCED"
else
echo "WARNING: ~/custom_ws/install/setup.bash does not exist"
fi
(and I get SOURCED
printed to the screen when I docker run
and docker exec
).
The trouble is... when I do docker run
or docker exec
into my image/container, I notice that the RTT_COMPONENT_PATH
is incomplete (and my components don't execute correctly).
$ docker run -it my_image
SOURCED
# env | grep RTT_COMPONENT_PATH
RTT_COMPONENT_PATH=/opt/orocos/foxy/lib/orocos:/opt/orocos/foxy/lib/orocos
When I try to run something, I get an error like this:
# ros2 run orocos_examples simple_rtt-gnulinux
0.434 [ ERROR ][ComponentLoader::importInstalledPackage(package, path_list)] No such package or directory found in search path: orocos_examples. Search path is: /opt/orocos/foxy/lib/orocos:.
0.434 [ ERROR ][ComponentLoader::importInstalledPackage(package, path_list)] Directories searched include the following:
0.434 [ ERROR ][ComponentLoader::importInstalledPackage(package, path_list)] - /opt/orocos/foxy/lib/orocos/orocos_examples
0.434 [ ERROR ][ComponentLoader::importInstalledPackage(package, path_list)] - /opt/orocos/foxy/lib/orocos/gnulinux/orocos_examples
0.434 [ ERROR ][ComponentLoader::importInstalledPackage(package, path_list)] - ./orocos_examples
0.434 [ ERROR ][ComponentLoader::importInstalledPackage(package, path_list)] - ./gnulinux/orocos_examples
Orocos package orocos_examples could not be imported.
If I then source my environment again, my env
changes and executable runs.
# source ~/.bashrc
SOURCED
# env | grep RTT_COMPONENT_PATH
RTT_COMPONENT_PATH=/opt/orocos/foxy/lib/orocos:/opt/orocos/foxy/lib/orocos:/root/custom_ws/install/lib/orocos
# ros2 run orocos_examples simple_rtt-gnulinux
Simple [foo]: constructed
I've also noticed that if I source the /opt/orocos/foxy/setup.bash
environment, my custom workspace is added... that can't be right...
# env | grep RTT
RTT_COMPONENT_PATH=/opt/orocos/foxy/lib/orocos:/opt/orocos/foxy/lib/orocos
# source /opt/orocos/foxy/setup.bash
# env | grep RTT
RTT_COMPONENT_PATH=/opt/orocos/foxy/lib/orocos:/opt/orocos/foxy/lib/orocos:/root/custom_ws/install/lib/orocos
What am I doing wrong here? Am I not "chaining" my colcon workspaces correctly? Do I need to source my workspace twice? Something else look obviously wrong?
I enabled COLCON_TRACE=1
on the sourcing of my custom_ws environment. On run
and exec
, I get a long list of export
commands and the following things sourced:
. "/opt/ros/foxy/local_setup.bash"
. "/opt/orocos/foxy/local_setup.bash"
. "/opt/orocos/foxy/etc/orocos/setup.sh"
. "/root/custom_ws/install/local_setup.bash"
Between the two /opt/orocos
sourcings, I get this:
if [ "$(echo -n $CMAKE_PREFIX_PATH | tail -c 1)" = ":" ]; then export CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH%?} ; fi
if [ "$(echo -n $PKG_CONFIG_PATH | tail -c 1)" = ":" ]; then export PKG_CONFIG_PATH=${PKG_CONFIG_PATH%?} ; fi
if [ "$(echo -n $RTT_COMPONENT_PATH | tail -c 1)" = ":" ]; then export RTT_COMPONENT_PATH=${RTT_COMPONENT_PATH%?} ; fi
Now, when I re-source .bashrc after I'm in the container, I get the same list of export
commands, except they're all #
-ed out (expected)... but the stanza above isn't included between the /opt/orocos
sourcings. I don't know if this is just a quirk with how colcon tracing works... but this is again strange to me.
So why isn't the RTT_COMPONENT_PATH
variable getting set correctly the first time things are sourced, but is getting set the second time?
I think this might be a 🐔 🥚 problem. I'm still seeing that I need to "double source" things. Here's what I think is happening.
I source my built workspace and that then 1) adds the ROS stuff, 2) adds the Orocos stuff (which doesn't see my workspace), and 3) adds my workspace stuff.
Then I source my built workspace a second time and then it 1) adds the ROS stuff, 2) adds the Orocos stuff (which now does see my workspace and adds it to the RTT var), and 3) adds my workspace stuff.
So maybe the solution is to make my custom workspace update the RTT var itself?