Docker - ashBabu/Utilities GitHub Wiki

Add udev rules on host to avoid permission issues for USB devices

  • Plug in the USB device
  • Run lsusb which would show Bus 001 Device 005: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
  • In the above 10c4 --> idVendor and ea60 --> idProduct
  • Or use udevadm info --name=/dev/ttyUSB0 --attribute-walk. Example output would look like
 looking at device '/devices/.../ttyUSB0':
    KERNEL=="ttyUSB0"
    ATTRS{idVendor}=="10c4"
    ATTRS{idProduct}=="ea60"
  • sudo nano /etc/udev/rules.d/99-usb-lidar.rules and add the following SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666", SYMLINK+="lidar"
  • sudo udevadm control --reload-rules && sudo udevadm trigger
  • ls -l /dev/lidar and it should show lrwxrwxrwx 1 root root 7 Month xx hr:min /dev/lidar -> ttyUSB0
  • Run the docker with -v /dev/lidar:/dev/lidar
  • The above method is more robust but for testing, you could run the docker with --device=/dev/ttyUSB0:/dev/ttyUSB0

Cross platform build

  • This means building an image, say for arm64 device, from a x86 amd64 device
  • docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
  • docker buildx create --use
  • docker buildx inspect --bootstrap

After the above, run the following on your x86 device

  • docker buildx build --platform linux/arm64 -t librealsense-arm .

Tag a tagged one

  • docker tag [IMAGE_ID] [REPOSITORY]:[TAG]

Deployment

  • If creating a Dockerfile, use CMD to run the commands, for example, ros2 launch

  • Then build the image or pull it from container registry and run

    /usr/bin/docker run -dit --rm --privileged --device-cgroup-rule='c 81:* rmw' --device-cgroup-rule='c 189:* rmw' -v /dev/:/dev/ --ipc=host --pid=host --net=host --restart unless-stopped --name hai-slam-container -v /home/$USER/Downloads/saved_data:/root/saved_data/:rw ghcr.io/headlightai/slam-ros2-deploy:latest.

  • The device-cgroup-rules are specifically for realsense cameras. Without --privileged, realsense imu topics are not visible inside docker

  • It will be running even after a system reboot

  • To stop it run docker stop hai-slam-container

Docker size

  • docker system df

Docker build cache remove

  • docker builder prune here

Goode video series

Docker with access to gpu, display etc

bash script to launch simulation using Nvidia graphics card:

  • xhost +local:*

  • sudo docker run -it --rm -e DISPLAY=$DISPLAY \ --env="QT_X11_NO_MITSHM=1" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --env="XAUTHORITY=$XAUTH" \ --volume="$XAUTH:$XAUTH" \ --runtime=nvidia \ --gpus all \ --privileged \ --net=host \ $USER/test_sim /bin/bash -c "terminator & terminator -e 'source /opt/ros/humble/setup.bash && source /ros2_ws/install/setup.bash && ros2 launch ardupilot_gz_bringup iris_maze.launch.py rviz:=false;/bin/bash ' & \ terminator -e 'source /opt/ros/humble/setup.bash && source /ros2_ws/install/setup.bash && ros2 launch ardupilot_ros cartographer.launch.py rviz:=false;/bin/bash' & \ terminator -e 'source /opt/ros/humble/setup.bash && source /ros2_ws/install/setup.bash && ros2 launch ardupilot_ros navigation.launch.py;/bin/bash' "

  • xhost +local:*

  • sudo docker run -it --rm -e DISPLAY=$DISPLAY \ --env="QT_X11_NO_MITSHM=1" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --env="XAUTHORITY=$XAUTH" \ --volume="$XAUTH:$XAUTH" \ --privileged \ --net=host \ $USER/test_sim /bin/bash -c "terminator & terminator -e 'source /opt/ros/humble/setup.bash && source /ros2_ws/install/setup.bash && ros2 launch ardupilot_gz_bringup iris_maze.launch.py rviz:=false;/bin/bash ' & \ terminator -e 'source /opt/ros/humble/setup.bash && source /ros2_ws/install/setup.bash && ros2 launch ardupilot_ros cartographer.launch.py;/bin/bash' "

Rename a docker image

  • docker image tag old_name:latest new_name:latest

Remove exited container

  • docker rm $(docker ps -a -f status=exited -q)

Remove dangling images

  • sudo sh -c 'docker rmi $(docker images -f "dangling=true" -q)'

Create a non-root user

# Create a non-root user
ARG USERNAME=ros
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN groupadd --gid $USER_GID $USERNAME \
  && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
  && mkdir /home/$USERNAME/.config && chown $USER_UID:$USER_GID /home/$USERNAME/.config

Then run docker run -it --user Ash -v $PWD/folder_name:/home/folder_name my_image

EntryPoint Docker

Video series

#/bin/bash
set -e

source /opt/ros/humble/setup.bash
exec $@

Dockerfile~~~~~~

FROM ros:humble

RUN ...

COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]

CMD["bash"]

In the terminal, if you run, docker run -it container_name ros2 topic list, it replaces the bash in CMD and runs ros2 topic list

Docker-Clion

Instructions

Add docker to user group

  • sudo service docker start

The following command will ensure that you can run docker with your user account (adding $USER to the docker group):

  • sudo usermod -a -G docker $USER

Note: Need to restart the system for the changes to take effect. Test it with docker run hello-world instead of sudo docker run hello-world

Generate IKFast using Docker (incomplete)

  • docker pull personalrobotics/ros-openrave

  • docker ps -a and find the container_name under IMAGE

  • docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" container_name to get a docker terminal

  • To get access to a file in the computer inside docker "docker run -v 'pwd':'pwd' -w 'pwd' -i -t container_name pwd". More details here

  • The tutorial described here should ideally work with personalrobotics docker image but have not tested fully

  • Useful links 1, 2

The command rosrun moveit_kinematics auto_create_ikfast_moveit_plugin.sh --iktype Transform6D $MYROBOT_NAME.urdf <planning_group_name> <base_link> <eef_link> described here is erroring out with some sympy issues.

ROS with Docker

  • To pull latest ROS (as of now ROS2 Foxy) from here
    sudo docker pull ros

  • Docker is a headless machine. Hence to instruct docker to use the Host's display and run docker
    sudo docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" ros

  • The above will create a new user-like in terminal with root<container_id>. However for GUI applications, might need to run xhost +local:root from the HOST's terminal. more details. Using xhost +local:root is NOT recommended

  • ros2 topic list which gives /parameter_events /rosout

  • sudo apt-get update
    If there is an error for the above command with GPG key error for Open Robotics, then run sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

  • To install in the docker
    sudo apt-get install ros-${ROS_DISTRO}-turtlesim

  • ros2 run turtlesim turtlesim_node

  • sudo docker exec -it <container_id> bash to get new terminal in docker

  • In a new docker terminal, ros2 run turtlesim turtle_teleop_key. Can use arrow keys to control the turtlebot

  • sudo docker ps -a to list all docker containers

  • Info on ROS2 on remote machine

  • The error libGL error: No matching fbConfigs or visuals found can be fixed with:

  • export LIBGL_ALWAYS_INDIRECT=1

  • The error libGL error: failed to load driver: swrast can be fixed with:
    sudo apt-get install -y mesa-utils libgl1-mesa-glx

  • Press Ctrl + Dto exit a docker container

  • To save changes to the docker container, first exit docker and in the HOST's terminal run
    sudo docker commit container_id commit_name

Docker commands

might have to add sudo before running docker

  • docker version
  • docker pull image_id
  • docker ps or docker ps -a or docker inspect container_name # To list containers
  • docker stop container_name
  • docker rm container_name
  • docker images # To see a list of downloaded images
  • docker run container_name # To run latest
  • docker run container_name:4 # To run version 4
  • docker run -d container_name # To detach and run docker
  • docker rmi image_name_or_id # To delete an image
  • docker run -it image_name # i - interactive and t - pseudo terminal
  • docker run -p 80:5000 kodecloud/simple-webapp
  • docker run -v /opt/datadir:/var/lib/mysql mysql # to store data to external location (/opt/datadir) from docker container
  • docker run -e APP_COLOR=blue simple-webapp-color # e stands for export APP_COLOR=blue (or setting an environment variable)
  • docker build -t nameOfFile .
⚠️ **GitHub.com Fallback** ⚠️