.envHOST_UID=1000
HOST_GID=1000
HOST_USER=jr
# GID
echo $(id -g)
# UID
echo $(id -u)
# username
echo $(id -un)
DockerfileARG 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.yamlservices:
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 --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: 도커 내 user를 root가 아닌 host의 user로 사용--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\]\$ '