본문 바로가기

IT 인프라/DevOps

나만의 Dockerfile Cheat Sheet

반응형

명령어 키워드들은 대/소문자를 구분하지는 않지만, 관례적으로 대문자를 사용한다.
주석은 #을 사용한다.

기본 명령어

FROM

Base Image를 지정한다.

###
# 사용법
###
FROM [이미지명]
FROM [이미지명]:[태그명]
FROM [이미지명]@[다이제스트]

###
# 사용 예시
###
FROM ubuntu:xenial

RUN

(이미지를 작성하기 위해 실행하는) 명령을 실행한다.

###
# 사용법
###
RUN [실행하고 싶은 명령]

###
# 사용 예시 : Shell 형식
#   - /bin/sh -c를 사용하는 것과 동일
#   - 기본 쉘을 변경하려면 SHELL 명령 사용
###
RUN apt-get install -y nginx

###
# 사용 예시 : Exec 형식
#   - 쉘을 경유하지 않고 직접 실행
###
RUN ["/bin/bash", "-c", "apt-get install -y nginx"]

CMD

컨테이너 실행시 수행될 명령을 적는다.
따라서 주로 컨테이너가 실행할 애플리케이션 실행 명령이 될 것이다.

Dockerfile 내에서 한 번만 사용 가능하며, 컨테이너 실행 시 입력받는 명령어로 인해 덮어씌어 질 수 있다.

###
# 사용법
###
CMD [실행하고 싶은 명령]

###
# 사용 예시 : Shell 형식
###
CMD nginx -g 'daemon off;'

###
# 사용 예시 : Exec 형식
###
CMD ["nginx", "-g", "daemon off;"]

###
# 사용 예시 : ENTRYPOINT 명령의 파라미터로 기술
###
ENTRYPOINT ["top"]
CMD ["-d", "10"]

ENTRYPOINT

CMD와 같이 컨테이너 실행시 수행할 명령을 적는다.

다만 CMD와는 달리 ENTRYPOINT는 컨테이너 실행 시 입력받는 명령어로 인해 덮어씌어지지 않는다.
즉, ENTRYPOINT로 선언된 명령어는 반드시 수행된다.

CMD와 조합하여 "ENTRYPOINT는 실행할 명령 자체"를 적고, "CMD는 명령에 필요한 Default 인자값"을 적는다.
CMD 값은 컨테이너 실행(docker container run) 시 입력받는 명령어로 인해 덮어씌어 지기 때문에 "사용자 정의 인자값"을 받을 수 있다.

###
# 사용법
###
ENTRYPOINT [실행하고 싶은 명령]

###
# 사용 예시 : Shell 형식
###
ENTRYPOINT nginx -g 'deamon off;'

###
# 사용 예시 : Exec 형식
###
ENTRYPOINT ["nginx", "-g", "daemon off;"]

ONBUILD

빌드 완료 후에 실행할 명령을 이미지 안에 설정한다. (공식 문서 설명의 해석인데 의미가 모호하다.)

공식 문서에는 ONBUILD를 "부모 Dockerfile이 자식 Dockerfile에게 주는 명령"이라고 표현했다.
즉, ONBUILD 명령을 포함한 부모 이미지를 Base로 사용하는 자식 Dockerfile에서는 빌드시 가장 먼저 ONBUILD를 수행한다.

보통 ONBUILD 명령을 포함한 이미지는 태그에 표시한다. (ex> ruby:2.0-onbuild)

ONBUILD 안에 "ADD", "COPY" 명령을 사용할 경우 Resource가 존재하지 않아 문제가 발생할 수 있으니 주의해야 한다.

###
# 사용법
###
ONBUILD [실행하고 싶은 명령]

###
# 사용 예제
###
ONBUILD RUN echo "Hello World"

STOPSIGNAL

컨테이너 종료 시 보낼 시그널 설정
시그널 번호(ex> 9) 또는 시그널 이름(ex> SIGKILL)을 지정 가능

###
# 사용법
###
STOPSIGNAL [시그널]

HEALTHCHECK

컨테이너 안의 프로세스가 정상적으로 작동중 인지 체크

###
# 사용법
###
HEALTHCHECK [옵션] CMD 실행할 명령

###
# 사용 예시
###
HEALTHCHECK --interval=5m --timeout=3s --retries=5 curl -f http://localhost/ || exit 1

환경 및 네트워크 설정 명령어

ENV

Dockerfile 안에서 사용할 환경변수 설정

컨테이너 실행 시 --env 옵션으로 덮어쓰기 가능

###
# 사용법
###
ENV [key] [value]
ENV [key]=[value]

###
# 사용 예제 : key value 형태
#   - 한 명령에 하나의 환경변수만 설정 가능 (여러 레이어 생성)
###
ENV myName "hyunto"
ENV myBlogURL "https://jhyunto.tistory.com"

###
# 사용 예제 : key=value 형태
#   - 한 번에 여러 개의 환경변수 설정 가능 (단일 레이어 생성)
###
ENV myName="hyunto" \
    myBlogURL="https://jhyunto.tistory.com"

WORKDIR

명령어를 수행할 공간(디렉토리) 지정
"RUN", "CMD", "ENTRYPOINT", "COPY", "ADD" 명령이 수행될 공간이다.

디렉토리가 없으면 새로 생성하고, 절대경로와 상대경로 모두 사용 가능하다.
ENV 명령에서 설정한 환경변수를 "$환경변수명"으로 사용할 수 있다.

###
# 사용법
###
WORKDIR [작업 디렉토리 경로]

###
# 사용 예시
###
ENV CONFIG_ROOT_DIR="/etc"
WORKDIR $CONFIG_ROOT_DIR
WORKDIR nginx
RUN ["pwd"]    # /etc/nginx 출력

USER

"RUN", "CMD", "ENTRYPOINT" 명령을 수행할 때 사용할 사용자 계정 설정
USER 명령으로 지정할 사용자는 RUN 명령으로 먼저 생성해야 한다.

###
# 사용법
###
USER [사용자명 / UID]

LABEL

이미지에 버전 정보, 작성자 정보, 코멘트 등의 정보를 제공

###
# 사용법
###
LABEL <key>=<value>

###
# 사용 예시
###
LABEL maintainer="hyunto<jhyunto@gmail.com>"
LABEL title="TestImage"
LABEL version="0.1"
LABEL description="This is a test image"

EXPOSE

컨테이너가 외부로 노출할 포트 번호를 지정

컨테이너 실행(docker container run) 시 -p(--publish) 옵션을 사용해 어떤 포트를 호스트에 공개(매핑)할 것인지 설정한다.

###
# 사용법
###
EXPOSE <포트 번호>

###
# 사용 예시
###
EXPOSE 8080

ARG

Dockerfile 안에서 사용할 변수를 정의

환경변수인 ENV와 달리 ARG는 Dockerfile 안에서만 사용 가능하다.
컨테이너 실행(docker container run) 시 --build-arg 옵션으로 추가/덮어쓰기 할 수 있다.

###
# 사용법
###
ARG <key>[=default value]

###
# 사용 예시
###
ARG LANGUAGE="korean"
RUN echo $LANGUAGE

SHELL

Default Shell 설정
Linux의 기본 쉘은 ["/bin/sh", "-c"]이고, Windows는 ["cmd", "/S", "/C"]이다.

###
# 사용법
###
SHELL ["쉘 경로", "파라미터"]

파일 핸들링 및 볼륨 명령어

ADD

호스트에 존재하는 파일, 디렉토리를 이미지에 추가
호스트의 파일 경로에는 와일드카드와 Go 언어의 filepath.Match 룰과 일치하는 패턴 사용 가능

원격 파일 다운로드, 아카이브 압축 해제 등의 기능 수행 가능

###
# 사용법
###
ADD <호스트의 파일 경로> <Docker 이미지의 파일 경로>
ADD ["<호스트의 파일 경로>", "<Docker 이미지의 파일 경로>"]

###
# 사용 예시
###
ADD *.txt /tmp/text/
ADD hos?.txt /tmp/text/

COPY

호스트에 존재하는 파일, 디렉토리 복사

ADD 명령과 비슷하지만 COPY 명령은 호스트에 존재하는 파일을 이미지 안으로 "복사하는 기능만 수행"한다.
즉, 단순이 이미지 안에 파일을 넣는 경우 사용한다.

###
# 사용법
###
COPY <호스트의 파일 경로> <Docker 이미지의 파일 경로>
COPY ["<호스트의 파일 경로>", "<Docker 이미지의 파일 경로>"]

VOLUME

이미지에 볼륨 할당

컨테이너 안의 데이터는 컨테이너 삭제시 보존되지 않는다.
컨테이너가 삭제되더라도 데이터를 보존하고 싶을 때 Host Machine 또는 Shared Storage에 VOLUME MOUNT 한다.

###
# 사용법
###
VOLUME ["/마운트_포인트"]

Docker 이미지 만들기

Dockerfile로 이미지 빌드

###
# Docker image 빌드하기 
# (Dockerfile이 현재 디렉토리에 존재한다고 가정한다)
###
$ docker build -t test:1.0 .

.dockerignore 파일

ADD 또는 COPY 명령 사용시 불필요한 파일, 디렉토리가 이미지에 포함되는 것을 막을 수 있다.
.gitignore와 사용법은 동일해 보인다.

참고

https://docs.docker.com/engine/reference/builder/#dockerignore-file

 

| Docker Documentation

Dockerfile reference Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands a user could call on...

docs.docker.com

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

 

Best practices for writing Dockerfiles

This document covers recommended best practices and methods for building efficient images. Docker builds images automatically by reading the instructions from a Dockerfile -- a text file that contains all...

docs.docker.com

 

반응형

'IT 인프라 > DevOps' 카테고리의 다른 글

Docker 이미지 용량을 줄이는 Tip  (0) 2019.11.19
나만의 Docker Compose Cheat Sheet  (0) 2019.11.18
나만의 Docker Cheat Sheet  (0) 2019.11.16
일반 계정으로 docker 명령어 사용하기  (0) 2019.11.16
git-secret  (0) 2019.11.16