ROS 도커 이미지 사용법 rocker 포함

OpenJR·2024년 10월 22일

Docker Compose 사용 시

.env

HOST_UID=1000
HOST_GID=1000
HOST_USER=jr
# GID
echo $(id -g)
# UID
echo $(id -u)
# username
echo $(id -un)

Dockerfile

ARG BASE_IMAGE
FROM ${BASE_IMAGE}

ARG HOST_UID
ARG HOST_GID
ARG HOST_USER

ENV TERM=xterm-256color
ENV SHELL=/bin/bash
ENV HOST_UID=${HOST_UID}
ENV GROUP_ID=${HOST_GID}
ENV USER_NAME=${HOST_USER}

ENV NVIDIA_VISIBLE_DEVICES="all"
ENV NVIDIA_DRIVER_CAPABILITIES="all"

RUN groupadd -g $HOST_GID $HOST_USER && \
    useradd -rm -u $HOST_UID -g $HOST_USER $HOST_USER && \
    usermod -aG sudo $HOST_USER && \
    echo "$HOST_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

docker-compose.yaml

services:
  ros1:
    image: humble-devel
    env_file:
      - .env
    build:
      context: ./
      dockerfile: Dockerfile
      args:
        BASE_IMAGE: osrf/ros:humble-desktop-full
        HOST_UID: $HOST_UID
        HOST_GID: $HOST_GID
        HOST_USER: $HOST_USER
    container_name: humble
    user: $HOST_UID:$HOST_GID
    volumes:
      - ./ws:/home/$HOST_USER/ws
      - /tmp/.X11-unix:/tmp/.X11-unix
      - $HOME/.ssh:/home/$HOST_USER/.ssh
      - $HOME/.config:/home/$HOST_USER/.config
      - $HOME/.gitconfig:/home/$HOST_USER/.gitconfig
      - ~/Dataset:/Dataset
    working_dir: /home/$HOST_USER/
    environment:
      - DISPLAY=$DISPLAY
      - QT_X11_NO_MITSHM=1
      - TZ="Asia/Seoul"
    privileged: true
    network_mode: host
    stdin_open: true
    tty: true
    ipc: host
    pid: host
    runtime: nvidia
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [gpu]
              count: all

Rocker 사용 시

레알 개편함;;;;

rocker --nvidia --cuda --x11 --privileged --name ROS1 --network host osrf/ros:noetic-desktop-full --user --nocleanup --volume ROS/ros1_ws/
  • --nvidia: GPU 사용
  • --cuda: CUDA 환경을 알아서 세팅해줌 (무조건 --nvidia도 같이 사용해야 한다.)
  • --x11: 시각화 GUI 사용
  • --privileged: 도커 옵션과 동일 기능
  • --name: 컨테이너의 이름
  • --network: 네트워크 방식
  • --user: 도커 내 userroot가 아닌 hostuser로 사용
  • --image-name: 내가 사용할 이미지의 이름
  • --nocleanup: 터미널 종료 해도 컨테이너 삭제되지 않음
  • --volume: 마운트 할 폴더
  • --git: host의 gitconfig를 그대로 사용
  • --persist-image: 컨테이너가 종료되어도 이미지를 삭제하지 않는다. (--nocleanup과 항상 같이 쓰여야 한다. --nocleanup시 해당 옵션 안해도 삭제되지 않긴 하는데 지저분한 에러메세지가 뜬다.)
    나는 주로 아래와 같이 사용한다.
rocker --nvidia --x11 --privileged --image-name ros:humble --name humble \
--env NVIDIA_DRIVER_CAPABILITIES=all --network host --user --nocleanup \
--volume ~/Docker/22.04/ws:/home/$USER/ws ~/.ssh:/home/$USER/.ssh \
--git osrf/ros:humble-desktop-full

쿠다는 무조건 최신으로 설치하기에 내가 수동으로 설치하려고 넣지는 않는다.

재부팅 후, 도커 컨테이너가 실행하지 않을 경우

빡치게 재부팅하면, docker start 로 컨테이너가 실행하지 않는 경우가 있다.
이 때,
1. sudo apt install python3-rocker로 설치한 경우: /usr/lib/python3/dist-packages/rocker
2. python3 -m pip install rocker로 설치한 경우: /home/$USER/.local/lib/python3.xx/site-packages/rocker (여기 파일이 없으면 경로를 python3 -m pip show rocker로 찾을 수 있다.)

안에 있는 nvidia_extension.py 파일을 아래와 같이 수정해주면 된다.

class X11(RockerExtension):
    @staticmethod
    def get_name():
        return 'x11'

    def __init__(self):
        self.name = X11.get_name()
        self._env_subs = None
        self._xauth = None

    def get_docker_args(self, cliargs):
        assert self._xauth, 'xauth not initialized, get_docker_args must be called after precodition_environment'
        xauth = self._xauth.name
        return "  -e DISPLAY -e TERM \
  -e QT_X11_NO_MITSHM=1 \
  -e XAUTHORITY=%(xauth)s -v %(xauth)s:%(xauth)s \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v /etc/localtime:/etc/localtime:ro " % locals()

    def precondition_environment(self, cliargs):
        self._xauth = tempfile.NamedTemporaryFile(prefix='.docker', suffix='.xauth', delete=not cliargs.get('nocleanup'))
        # 여기서 부터
        rocker_dir = Path.home() / ".rocker"
        rocker_dir.mkdir(parents=True, exist_ok=True)
        self._xauth.name = self._xauth.name.replace("/tmp", str(rocker_dir))
        # 여기까지 추가
        xauth = self._xauth.name

이름 헷갈림

host와 컨테이너 모두에서 커맨드 시작이 동일해 헷갈려, .bashrc를 아래와 같이 수정해주면 편하다.

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
---->
PS1='${debian_chroot:+($debian_chroot)}[22.04] \[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

profile
Jacob

0개의 댓글