본문 바로가기
프로그래밍

도커 파일(Dockerfile) 자주 쓰이는 명령어 정리

by bantomak 2024. 3. 27.

Dockerfile 포맷

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

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

 

각 명령문은 명령어로 시작하고 여러 개의 인자가 따라올 수 있으며, 해당 명령문에 대한 주석도 달 수 있다. 인자와 구분이 쉽도록 명령어는 모두 영어 대문자로 써주는 것이 관례이다.

 

FROM 명령문

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

 

하나의 Docker 이미지는 base 이미지부터 시작해서 기존 이미지 위에 새로운 이미지를 중첩해서 여러 단계의 이미지 층(layer)을 쌓아가며 만들어진다.

 

FROM 명령문은 이 base 이미지를 지정해 주기 위해서 사용되는데, 보통 Dockerfile 내에서 최상위단에 위치한다. base 이미지는 일반적으로 Docker Hub와 같은 Docker Repository에 올려놓은 잘 알려진 공개 이미지인 경우가 많다.

 

  • ubuntu 최신 버전을 base 이미지로 사용
FROM ubuntu:latest
  • NodeJS 12를 base 이미지로 사용
FROM node:12

 

WORKDIR 명령문

WORKDIR 명령문은 쉘(shell)의 cd 명령문처럼 컨테이너 상에서 작업 디렉터리로 전환을 위해 사용한다. WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행된다.

WORKDIR <이동할 경로>
  • /usr/app으로 작업 디렉터리 전환
WORKDIR /usr/app

 

RUN 명령문

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

 

RUN 명령문은 마치 쉘(shell)에서 커맨드를 실행하는 것처럼 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해서 사용한다. 쉘(shell)을 통해서 거의 모든 작업을 하는 것처럼 RUN 명령문으로 할 수 있는 작업은 무궁무진하지만 보통 이미지 안에서 특정 소프트웨어를 설치하기 위해서 많이 사용된다.

 

  • curl 도구 설치
RUN apk add curl
  • npm 패키지 설치
RUN npm install --silent
  • pip 패키지 설치
RUN pip install -r requirements.txt

 

ENTRYPOINT 명령문

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

 

ENTRYPOINT 명령문은 이미지를 컨테이너로 띄울 때 항상 실행돼야 하는 커맨드를 지정할 때 사용한다. ENTRYPOINT 명령문은 Docker 이미지를 마치 하나의 실행 파일처럼 사용할 때 유용하다. 왜냐하면 컨테이너가 뜰 때 지정된 커맨드가 실행되고, 이 커맨드로 실행된 프로세스는 죽을 때, 컨테이너를 따라서 종료되기 때문이다. 보통은 컨테이너를 실행할 때 사용한다.

 

  • npm start 스크립트 실행
ENTRYPOINT ["npm", "start"]
  • Django 서버 실행
ENTRYPOINT ["python", "manage.py", "runserver"]

 

EXPOSE 명령문

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

 

EXPOSE 명령문은 네트워크 상에서 컨테이너로 들어오는 트래픽(traffic)을 리스닝하는 포트와 프로토콜을 지정하기 위해서 사용한다. 프로토콜은 TCP와 UDP 중 선택할 수 있는데 지정하지 않으면 TCP가 기본값으로 사용된다.

 

여기서 주의할 점은 EXPOSE 명령문으로 지정된 포트는 해당 컨테이너의 내부에서만 유효하며, 호스트(host) 컴퓨터에서는 이 포트를 바로 접근할 수 있는 것은 아니라는 것이다. 호스트 컴퓨터로부터 해당 포트로 접근을 허용하려면, docker run 커맨드-p 옵션을 통해 호스트 컴퓨터의 특정 포트로 포트 포워딩(Port forwarding) 시켜줘야 한다.

 

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

 

COPY/ADD 명령문

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

 

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

 

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

 

ADD 명령문은 좀 더 파워풀한 COPY 명령문이라고 생각할 수 있다. ADD 명령문은 일반 파일뿐만 아니라 압축 파일이나 네트워크 상의 파일도 사용할 수 있다. 이렇게 특수한 파일을 다루는 게 아니라면 COPY 명령문을 사용하는 것이 권장된다.

 

Dockerfile 예시

FROM mcr.microsoft.com/dotnet/aspnet:5.0

WORKDIR /testproject
COPY TestProject appsettings.json ./
COPY Json ./Json/

EXPOSE 5050

ENTRYPOINT ["./TestProject"]

 

함께 읽으면 좋은 글

 

[Linux/Unix] 절대경로와 상대경로

절대 경로(Absolute Path) 표시법 절대 경로는 파일의 root로부터 해당 파일에 이르기까지의 전체 경로(URL)를 의미한다. 절대 경로는 보통 다른 사람의 문서나 파일을 이용할 때 사용한다. 절대 경로

jettstream.tistory.com

 

[Docker] RUN vs CMD vs ENTRYPOINT in Dockerfile

헷갈리기 쉬운 Docker Dockerfile 명령어, RUN, CMD, ENTRYPOINT. 모두 뭔가 실행하는 명령어이다.

blog.leocat.kr

참조 사이트

 

Dockerfile에서 자주 쓰이는 명령어

Engineering Blog by Dale Seo

www.daleseo.com

댓글