포스트

Dockerfile 로 빌드하는 방법

Dockerfile 을 이용해서 Docker Image 를 build 하는 방법과 팁을 적어둠


Dockerfile

Dockerfile 은 Docker 이미지를 생성하기 위한 스크립트 파일로, 이미지 빌드에 필요한 명령어와 설정을 포함하고 있다. 이를 통해 컨테이너 생성을 자동화하고, 이미지의 구성 내용을 명확히 할 수 있다.

Dockerfile 의 구성 요소

FROM

  • 베이스 이미지를 지정한다.
  • Docker Hub 에서 원하는 Image 를 선택한 뒤 입력한다.
  • 예 : FROM ubuntu:18.04

RUN

  • 쉘 명령어를 실행하여 새로운 레이어를 생성
  • 주로 패키지 설치나 설정 작업에 사용
  • 예 : RUN apt update && apt install -y python

COPY

  • 호스트 시스템의 파일을 컨테이너 이미지로 복사한다.
  • 예 : COPY ./app /usr/src/app

ADD

  • 파일 복사 기능은 COPY 와 유사하지만, 압축 파일을 자동으로 해제하거나 URL 에서 파일을 다운받을 수 있다
  • 예 : ADD archive.tar.gz /data

WORKDIR

  • 컨테이너 내 작업 디렉토리를 설정한다.
  • 디렉토리가 없으면 새로 생성된다.
  • 예 : WORKDIR /app

CMD

  • 컨테이너가 시작될 때 실행할 기본 명령을 지정한다.
  • Dockerfile 내에서 한번만 사용할 수 있다.
  • CMD "python", "app.py"

ENTRYPOINT

  • CMD 와 유사하지만 컨테이너 실행 시 고정된 명령으로 동작한다.
  • 예 : ENTRYPOINT ["/root/anaconda3/bin/jupyter", "lab"]

ENV

  • 환경 변수를 설정한다.
  • 예 : ENV PATH="/root/anaconda3/bin:${PATH}"

VOLUME

  • 컨테이너와 호스트 간에 데이터를 공유할 디렉토리를 설정한다.
  • 예 : VOLUME /data

Dockerfile 예제

  • Ubuntu 22.04 와 CUDA 11.8 런타임을 사용하고, Python 과 Anaconda 를 설치하여 Jupyter Lab 을 실행하는 Docker 이미지를 생성한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Dockerfile
FROM nvidia/cuda:12.0.0-devel-ubuntu22.04

# 상호 작용 삭제
ARG DEBIAN_FRONTEND=noninteractive

# 로케일 설정
RUN apt-get update && \
    apt-get install -y locales && \
    localedef -i en_US -f UTF-8 en_US.UTF-8 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

ENV LANGUAGE en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENV LC_CTYPE en_US.UTF-8
ENV LC_MESSAGES en_US.UTF-8

# 필수 패키지 설치
RUN apt-get update && \
    apt-get install -y \
        python3 \
        python3-dev \
        libmariadb-dev \
        libpq-dev \
        net-tools \
        wget \
        nano \
        vim \
        lsof \
        iputils-ping \
        python3-pip && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Anaconda 설치 (인터넷에서 받아와야한다.)
WORKDIR /tmp
COPY ./Anaconda3-2024.02-1-Linux-x86_64.sh /tmp
RUN bash Anaconda3-2024.02-1-Linux-x86_64.sh -b -p /root/anaconda3 && \
    rm Anaconda3-2024.02-1-Linux-x86_64.sh

# PATH 환경 변수 설정
ENV PATH="/root/anaconda3/bin:${PATH}"

# Conda 초기화 및 Jupyter 설치
RUN /root/anaconda3/bin/conda init bash && \
    /root/anaconda3/bin/conda install -y jupyterlab jupyter

# Jupyter 설정 파일 생성
RUN jupyter notebook --generate-config

# Jupyter 설정 수정
## hash 값 빈칸으로 설정
RUN echo "c.ServerApp.password = "'argon2:$argon2id$v=19$m=10240,t=10,p=8$enVQgX8/LDFovYjt6d8Zow$3mBk4hCXSlQ+TO72Q8UHJ3rT8jqsL+9vpKY8dQ8ANBM'" >> /root/.jupyter/jupyter_notebook_config.py && \
    echo "c.ServerApp.ip = '0.0.0.0'" >> /root/.jupyter/jupyter_notebook_config.py && \
    echo "c.ServerApp.notebook_dir = '/data'" >> /root/.jupyter/jupyter_notebook_config.py && \
    echo "c.ServerApp.allow_root = True" >> /root/.jupyter/jupyter_notebook_config.py && \
    echo "c.ServerApp.open_browser = False" >> /root/.jupyter/jupyter_notebook_config.py && \
    echo "c.ServerApp.terminado_settings = { 'shell_command': ['bash'] }" >> /root/.jupyter/jupyter_notebook_config.py && \
    echo "c.ServerApp.max_buffer_size = 1000000000000" >> /root/.jupyter/jupyter_notebook_config.py

# Python 심볼릭 링크 설정
RUN rm /usr/bin/python3 && ln -s /root/anaconda3/bin/python /usr/bin/python3 && \
    ln -s /usr/bin/python3 /usr/local/bin/python

# 작업 디렉토리 설정
WORKDIR /data

ENTRYPOINT ["/root/anaconda3/bin/jupyter", "lab"]

Dockerfile 꿀팁

  • ARG DEBIAN_FRONTEND=noninteractive : 설치 할때 상호작용을 받지 않아 사용자의 입력을 기다리지 않는다.

    Jupyter Notebook 암호 만들기

1
2
3
4
# !pip install notebook
from jupyter_server.auth import passwd

print(passwd())
  • 원하는 암호를 입력하면 암호화 되어 출력된다.

Dockerfile 로 Docker Image build 하기

1
docker build -t <image:tag> .
  • 만일 Dockerfile 이 다른 경로에 있다면
1
docker build -t <image:tab> -f <file_path> .
Google AdSense — Post Ad
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Comments powered by Disqus.