Background of the Issue1
start.sh has the following script-
#!/usr/bin/env bash python3 RoboticsAcademy/manage.py runserver 0.0.0.0:8000 & python3.8 manager.py
Running the command
docker run -it --rm -p 8000:8000 -p 2303:2303 -p 1905:1905 -p 8765:8765 -p 6080:6080 -p 1108:1108 foxy-radi ./start.sh does not automatically source the
As a result, when the exercise is run, it throws the error that the ROS commands are not recognized. This was highlighted in RoboticsAcademy’s Issue #958.
Reason of the Issue
~/.bashrc contains the lines at the start-
# If not running interactively, don't do anything [ -z "$PS1" ] && return
Any non-interactive terminal exits early as a result without raising any error. Ultimately, many of the environment variables that we desire are not set.
start.sh is run non-interactively from a docker container. Therefore, it does not have “$PS1” set.
The solution mentioned in this AskUbuntu answer would be deemed as bad practice. It asks you to modify permissions of the
In fact, this StackOverflow comment describes what could go wrong.
Currently, all the
source commands for ROS and Gazebo setup files have been added in a separate script called
start.sh has been modified as follows-
#!/usr/bin/env bash # This file is intended to be run from the root # of the Docker container # radi-entrypoint's primary purpose is to source the ROS setup files. source radi-entrypoint.sh # Start the Django server. Load the list of exercises from db.sqlite3 python3 RoboticsAcademy/manage.py runserver 0.0.0.0:8000 & # Start RADI python3.8 manager.py
We also need ROS environment sourced inside the bash terminal as the console would be used by the student.
The only mention of
~/.bashrc inside the Dockerfile is in the following layer-
RUN echo 'source /radi-entrypoint.sh' >> ~/.bashrc
The proposed method allows us to reduce redundancy in the ROS commands inside
manager.py by ensuring that the ROS environment is sourced at all places.
The issue arose on switching the Docker base images from “osrf/ros:melodic-desktop-full” to “nvidia/opengl:1.2-glvnd-runtime-ubuntu18.04”.
OSRF images get around this issue by defining the
ros-entrypoint.sh in the core(most barebone) image. On the contrary, the opengl image is just a hardware accelerated Linux image.