Dockerfile

2020년 6월 17일 수정

Dockerfile은 Docker 용 이미지를 빌드하기 위한 특수한 DSL 스크립트 언어로 작성하는 스펙 파일이다.

평범한 스펙 예제

FROM debian:buster

RUN apt-get update && \
    apt-get install -y build-essential python-dev python-pip

ADD . /app

RUN cd /app && \
    make && \
    make install && \
    pip install -r requirements.txt

ENV APP_NAME "sample"
ENV APP_VERSION "1.0"

ENTRYPOINT ["/usr/local/bin/app"]

이 이미지는 debian:buster 라는 리눅스 컨테이너에서 몇 가지 빌드에 필요한 도구들과 파이썬 도구들을 설치한 후 실제 앱을 빌드하고 실행시키는 내용을 포함하고 있다.

RUN 은 보다시피 실행시킬 명령어를 기입할 수 있는 커맨드다. 커맨드를 여러 줄에 나누어서 적어도 관계 없지만, 길이에 한계가 있기 때문에 이런 식으로 한 줄에 몰아서 적는 형태를 많이들 사용한다.

ADD 는 현재 빌드가 진행되고 있는 디렉터리의 내용물을 이미지에 몽땅 복사한다. 어쩌면 가장 중요한 명령이다.

ENV 는 이름에서 유추 가능하다시피 환경 변수(Environment Variable)를 설정하는 커맨드다.

ENTRYPOINT 는 실제로 이미지가 기동 되면 실행되는 셸 커맨드를 기입하는 곳이다. 이것 대신 CMD 로 기입할 수도 있다. 다만 CMDENTRYPOINT 와 비교해서 한 가지 특이점이 있는데, 만약 사용자 커맨드가 지정되면 CMD 로 명시한 명령어는 실행되지 않는다. 반면 ENTRYPOINT 는 사용자의 커맨드를 무시하고 실행된다.

사용자 지정

특정 사용자 권한으로 특정 명령을 실행하고 싶다면 USER 커맨드를 쓸 수 있다.

RUN groupadd -r someuser
RUN useradd -m -r -g someuser someuser
USER someuser

컨테이너가 root 유저 기반으로 돌아가니 꺼릴 게 없다.

Health Checking

이제는 서버가 떴는지 확인하기 위한 스크립팅을 지원한다.

HEALTHCHECK --interval=5s \
            --timeout=5s \
            --retries=6 \
            CMD curl -fs http://localhost:1234/ || exit 1

Multi Stage Building

이미지를 작성하는 데 단계가 많다면 중간에 실패했을 때의 리스크가 너무 크다. 이럴 때는 스테이지를 나눠서 빌드하는 방법이 있다.

FROM someimage AS stage1
...

FROM stage1 AS stage2
...

# last stage
FROM stage2
...

이렇게 하면 특정 스테이지에서 중단되어도 이전 스테이지의 빌드 내용은 기록되어 있어서 다시 빠르게 시도할 수 있다.

외부 링크