[Docker] Dockerfile

Dockerfile

도커에서는 Dockerfile을 통해 컨테이너에 설치해야 하는 패키지, 추가해야 하는 소스코드, 실행해야하는 명령어와 셸 스크립트 등을 읽어 컨테이너에서 작업을 수행한 뒤 이미지를 생성할 수 있다.

Build

이미지 빌드를 시작하면 도커는 먼저 빌드 컨텍스트를 읽는다. Dockerfile이 위치한 디렉토리가 빌드 컨텍스트가 된다. 빌드 컨텍스트는 이미지를 만드는데 필요한 파일, 소스코드, 메타데이터 등을 포함하는 디렉토리이다. 또한 이 때 불필요한 파일은 .dockerignore을 통해 제외시킬 수 있다.

Dockerfile을 토대로 이미지를 생성해나가는 과정에서는 다수의 컨테이너를 사용한다. 즉 ADD, RUN등 하나의 명령어가 실행될 때 마다 새로운 컨테이너가 하나씩 만들어지며 이를 이미지로 커밋한다. 매 Step마다 반복이 되며 이렇게 이미지 레이어가 쌓이게 된다.

또한 한번 빌드를 마치고 난 뒤 다시 빌드를 수행하게 되면 이전 빌드에서 사용한 이미지를을 cache해서 사용하게 된다. 캐시는 --no-cache 옵션을 통해 끌 수 있다.

멀티 스테이지

하나의 Dockerfile내에 여러개의 FROM 이미지를 정의함으로써 빌드 완료 시 최종적으로 생성될 이미지의 크기를 줄일 수 있다. 멀티 스테이지 빌드는 반드시 필요한 실행 파일만 최종 이미지 결과물에 포함시킴으로 써 이미지의 크기를 줄이게 된다.

Command

FROM

생성할 이미지의 베이스가 될 이미지를 지정한다.

MAINTAINER

이미지를 생성한 개발자의 정보를 나타낸다. Docker 1.13.0 이후에는 사용되지 않고 LABEL을 통해 표현한다.
LABEL maintainer "hayoung <lovelydays95@gmail.com>"

LABEL

이미지에 메타데이터를 추가한다.

RUN

이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행한다.

ADD

파일을 이미지에 추가한다. 호스트 디렉토리 뿐만 아니라 url을 통하거나 tar같은 파일을 압축을 해제해서 추가해준다. 다만 url이나 tar의 경우 정확히 어떤 파일이 이미지에 추가될지 모르므로 권장하지 않는다.

COPY

로컬 디렉토리에서 읽은 컨텍스트로부터 이미지에 파일을 복사한다.

WORKDIR

명령을 실행할 디렉토리를 나타낸다.

EXPOSE

Dockerfile의 빌드로 생성된 이미지에서 노출할 포트를 설정한다.

CMD

컨테이너가 시작될 때 마다 실행할 커맨드를 설정할 수 있다. Dockerfile에서 한번만 사용할 수 있다.

ENTRYPOINT

컨테이너가 시작될 때 수행할 명령을 지정한다. 커맨드를 인자로 받아 사용할 수 있는 스크립트의 역할도 가능하다. 즉 필요한 설정에 대해 스크립트를 만들어두고 스크립트를 이미지에 복사한 뒤 ENTRYPOINT를 해당 스크립트를 설정하고 이미지를 빌드해 사용한다. 스크립트에서 필요한 인자는 docker run 명령에서 넘긴다.

ENV

Dockerfile에서 사용될 환경변수를 지정한다.

VOLUME

빌드된 이미지로 컨테이너를 생성했을 때 호스트와 공유할 컨테이너 내부 디렉토리를 지정한다.

ARG

build 명령을 수행할 때 인자를 입력받아 Dockerfile내에서 사용될 변수 값을 설정한다.

USER

USER를 통해 컨테이너 내에서 사용될 사용자 계정이나 UUID를 지정할 수 있다. 이를 통해 그 아래 명령어는 해당 사용자 권한으로 실행된다.

ONBUILD

빌드된 이미지를 기반으로 하는 다른 이미지가 Dockerfile로 생성될 때 실행할 명령어를 추가한다. 빌드된 이미지에는 영향을 미치지 않으며 빌드된 이미지를 사용해서 빌드하는 이미지에 영향을 미치게 된다. 이 기능은 상속되지 않는다.

STOPSIGNAL

컨테이너가 정지될 때 사용될 시스템 콜의 종류를 지정한다.

HEALTHCHECK

이미지로부터 생성된 컨테이너에서 동작하는 어플리케이션의 상태를 체크한다. 컨테이너 내부의 어플리케이션은 종료되지 않았으나 동작하지 않는 상태를 방지할 수 있다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/22/Docker/dockerfile/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.