docker Container 를 활용하여 Jupyter Notebook 을 실행하는 내용에 대하여 알아보도록 하겠습니다. 컨테이너 사용자와 호스트 사용자 간 UID/GID 가 불일치 하면 파일을 불러오거나 생성할 때 권한 문제가 발생합니다. 이를 해결하는 방법을 정리하면 다음과 같습니다.

일반적인 컨테이너 실행 및 Docker Compose설정파일을 생성한 내용은 다음과 같습니다.

# Dockerfile.ml
# 활용한 Docker Image 주소
FROM jupyter/datascience-notebook

# 루트 권한으로 전환
USER root
RUN apt-get update

# 사용자 jovyan이 없을 경우, USER 전환 전에 명시적으로 생성
ENV NB_USER=jovyan
RUN if ! id -u ${NB_USER} > /dev/null 2>&1; then \
    echo "Creating user ${NB_USER}..." && \
    groupadd --gid 1000 ${NB_USER} && \
    useradd -s /bin/bash --uid 1000 --gid 1000 -m -k /etc/skel ${NB_USER}; \
  fi
USER ${NB_USER}

# Python 패키지 설치
RUN pip install --upgrade pip && \
  pip install --upgrade numpy pandas matplotlib

WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN if [ -f /app/requirements.txt ]; then \
    echo "Installing packages from requirements.txt..." && \
    pip install --no-cache-dir -r /app/requirements.txt; \
  fi

# Jupyter 환경 변수 설정
ENV JUPYTER_ENABLE_LAB=yes
ENV JUPYTER_ALLOW_INSECURE_WRITES=true
EXPOSE 8888

# 컨테이너 내부 작업 디렉토리 설정
WORKDIR /home/jovyan/work

# JupyterLab 자동 실행
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--NotebookApp.token=''"]

그리고 docker-compose.yml 은 다음과 같다.

# version: '0.0.1'
services:

  pyml-cpu:
    build:
      context: ./docker
      dockerfile: Dockerfile.ml
      args:
        HOST_UID: ${UID}
        HOST_GID: ${GID}
    container_name: pyml
    image: pyml-cpu:v0.0.1
    # 호스트 사용자와 컨테이너 사용자 UID/GID 일치
    user: "${UID}:${GID}"
    ports:
      - "8888:8888"
    volumes:
      - ./:/home/jovyan/work
    environment:
      - JUPYTER_ENABLE_LAB=yes
    restart: unless-stopped
    command: >
      jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --NotebookApp.token=''

  pytorch-gpu:
    build:
      context: ./docker
      dockerfile: Dockerfile.torch
      args:
        HOST_UID: ${UID}
        HOST_GID: ${GID}
    container_name: pytorch
    image: pytorch-gpu:v0.0.1
    # 호스트 사용자와 컨테이너 사용자 UID/GID 일치
    user: "${UID}:${GID}"
    ports:
      - "8888:8888"
    volumes:
      - ./:/home/jovyan/work
    environment:
      - JUPYTER_ENABLE_LAB=yes
    # 컨테이너가 항상 다시 시작되도록 설정
    restart: unless-stopped
    # GPU 기능 활성화
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
    command: >
      jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --NotebookApp.token=''

권한값을 일치시키기 위한 환경변수 값을 .env 로 다음과 같이 생성합니다.

#.env
UID=1000
GID=1000