[ #3 ] Dockerfile에서 자주 쓰이는 명령어


Dockerfile 포멧

하나의 Dockerfile은 기본적으로 다음과 같은 구조를 가진 여러 개의 명령문으로 구성되어 있습니다.

# 주석(Comment)
명령어(INSTRUCTION) 인자(arguments)

각 구문은 명령어와 인자로 이루워져있고, 명령어는 소문자로 쓸수도 있지만 네이밍 컨벤션을 따라서 명령어는 대문자로만 작성하는게 좋습니다.


FROM 명령문

FROM <이미지>
FROM <이미지>:<태그>

FROM명령문은 base image를 지정해주기 위해서 사용합니다. 하나의 Docker image는 base 이미지로부터 시작해서 새로운 이미지를 중첩해서 여러 단계의 이미지 층을 쌓아가면서 만들어지는 것입니다.

  • python 최신버전을 base 이미지로 사용
FROM python:latest
  • NodeJS 11버전을 base 이미지로 사용
FROM node:latest

WORKDIR 명령문

WORKDIR 명령문은 쉘의 cd 와 같습니다. WORKDIR 명령문을 사용하여 디렉토리 위치를 이동시키면 그이후에 등장하는 모든 커멘드(RUN, CMD, ENTRYPOINT, COPY, ADD)는 해당 디렉토리 위치 기준으로 실행됩니다

WORKDIR <이동할경로>
  • /usr/test로 작헙할 디렉토리위치 전환
WORKDIR /usr/test

RUN 명령문

RUN ["<커맨드>", "<파라미터1>", "<파라미터2>" ...]
RUN <전체 커맨드>
  • npm 패키지 설치
RUN npm install --silent
  • pip 패키지 설치
RUN pip install -r requirements.txt
#Dockerfile
FROM ubuntu:latest
CMD ["echo", "CMD test"]

위와 같은 도커파일이 있을 때, 이미지를 빌드하고 실행해보도록 하겠습니다.

먼저, 아래 명령어로 이미지를 빌드해줍니다.

docker build -t cmd_test .

ENTRYPOINT 명령문

ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>" ...]
ENTRYPOINT <전체 커맨드>

ENTRYPOINT 명령문은 컨테이너가 실행될때 항상 실행되야하는 커멘드를 지정할 때 사용합니다.

  • Django 서버 실행하기
ENTRYPOINT ["python", "manage.py", "runserver"]

CMD 명령문

CMD ["<커맨드>","<파라미터1>","<파라미터2>"]
CMD ["<파라미터1>","<파라미터2>"]
CMD <전체 커맨드>

CMD 명령문은 컨테이너가 시작될때 디폴트로 실행할 커맨드나, 디폴트로 파라미터를 넘길때 사용됩니다. CMD 명령문은 Dockerfile의 마지막 라인에 쓰곤하는데요, 이 명령문은 Dockerfile당 한줄만 사용할 수 있습니다. 여러줄을 쓴다면 가장 마지막 줄만 적용됩니다. 또한, docker run뒤에 인자가 주어진다면 도커파일내의 CMD명령문은 무시됩니다.

EXPOSE 명령문

EXPOSE <포트>
EXPOSE <포트>/<프로토콜>

EXPOSE 명령문은 네트워크 상에서 컨테이너로 들어오는 트래픽(traffic)을 리스닝(listening)하는 포트와 프로토콜를 지정하기 위해서 사용됩니다. 프로토콜은 TCP와 UDP 중 선택할 수 있는데 지정하지 않으면 TCP가 기본값으로 사용됩니다. 여기서 주의해야할 점은 EXPOSE 명령문으로 지정된 포트는 해당 컨테이너 내부에서만 유효한데요, 호스트 컴퓨터로부터 해당 포트로 접근을 허용하려면 docker run 커맨드에 -p 옵션을 추가하여 바인딩 해줘야 합니다.

  • 80/TCP 포트로 리스닝
EXPOSE 80
  • 80/UDP 포트로 리스닝
EXPOSE 80/udp

COPY/ADD 명령문

COPY <src>... <dest>
COPY ["<src>",... "<dest>"]

COPY 명령문은 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해서 사용됩니다. 절대 경로와 상대 경로를 모두 지원하며, 상대 경로를 사용할 때는 이 전에 등장하는 WORKDIR 명령문으로 작업 디렉토리를 어디로 전환했는지 고려해야 합니다.

  • 이미지를 빌드한 디렉터리의 모든 파일을 컨테이너의 app/test 디렉터리로 복사
WORKDIR app/test
COPY . .

ADD 명령문은 좀 더 파워풀한 COPY 명령어라고 보시면되는데요, ADD 명령문은 일반 파일이외에도 압축파일이나 네트워크 상의 파일도 사용할 수 있습니다. 공식문서에 의하면, 이러한 특수경우가 아닐경우 COPY 를 사용하는것이 권장됩니다.


ENV 명령문

ENV <키> <값>
ENV <키>=<값>

ENV 명령문은 환경 변수를 설정하기 위해서 사용합니다. ENV 명령문으로 설정된 환경 변수는 이미지 빌드 시에도 사용됨은 물론이고, 해당 컨테이너에서 돌아가는 애플리케이션도 접근할 수 있습니다.

  • DB_PASS 환경 변수를 1234로 설정
ENV DB_PASS 1234

ARG 명령문

ARG <이름>
ARG <이름>=<기본 값>

ARG 명령문은 docker build 커맨드로 이미지를 빌드 할때, --build-arg 옵션을 추가하여 넘길 수 있는 인자를 정의하기 위해 사용합니다.
예를 들어, Dockerfile에 다음과 같이 ARG 명령문으로 port를 인자로 선언해주면,

ARG port

다음과 같이 docker build 커맨드에 --build-arg 옵션에 port 값을 넘길 수가 있습니다.

$ docker build --build-arg port=8080 .

인자의 디폴트값을 지정해주면, --build-arg 옵션으로 해당 인자가 넘어오지 않았을 때 사용됩니다.

ARG port=8080

설정된 인자 값은 다음과 같이 ${인자명} 형태로 읽어서 사용할 수 있습니다.

CMD start.sh -h 127.0.0.1 -p ${port}