도찐개찐

Dockerfile 주 사용 명령어 본문

Infra -------------------------/DOCKER

Dockerfile 주 사용 명령어

도개진 2022. 3. 18. 12:44

Dockerfile 주 사용 명령어

Dockerfile은 Docker 이미지(image)의 빌드(build) 과정 중 실행해야 하는 명령어들을 담은 텍스트 문서로  Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하여 이미지를 생성해줍니다.

Dockerfile 작성 규칙

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

{명령어(INSTRUCTION)} {인자(arguments)}
// 주석 사용 방법
# 주석입니다.
RUN ["", ""]
 
* 명령문은 명령어로 시작하고 여러개의 argument 가 따라올 수 있습니다.

* 주석사용으로 명령어 사용에 대한 코멘트 삽입 가능 합니다.

* 모든 명령어는 대문자로 작성하여 인자와 구분 쉽도록 작성하는 것이 관례 입니다.

 

FROM 명령문

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

* docker 이미지는 base이미지 위에 여러 단계의 이미지를 쌓아 새로운 이미지를 만들 수 있습니다.

* FROM 명령어는 base이미지를 사용하기 위해 사용 됩니다.

* Dockerfile 문석 작성시 통상적으로 최상단에 작성 합니다. 

* base 이미지는 Docker Hub와 같은 공개 이미지를 주로 사용 하게 되는데 공개이미지 확인 방법은 아래 포스팅을 확인 부탁 드립니다.

 

#3 Docker ubuntu(이미지) 셋팅

* 본 포스팅 글은 ubuntu 설치에 한정 하지 않고 docker 이미지를 확인하여 해당 이미지를 다운로드 하고 컨테이너 생성하는데 까지 기초적인 매뉴얼을 다루었으니 참고 하셔서 읽어 주시기 바랍니

dev-truly.tistory.com

* ubuntu base 이미지 활용시

FROM ubuntu:latest
FROM ubuntu

 

WORKDIR

* 쉘(shell) cd 명령어 처럼 컨테이너 상 작업 디렉토리 전환시 사용

* WORKDIR 명령어 이후 모든 명령어는 WORKDIR로 전환 된 경로에서 실행

WORKDIR <이동할 경로>

* /usr/app으로 작업 디렉터리 전환

WORKDIR /usr/app

 

RUN

* 쉘(shell)에서 기본 명령어(command)를 실행 하기 위해 사용

* 주로 특정 패키지 및 프로그램을 설치하기 위해  사용

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

* apt-get 설치

RUN apt-get install curl

* npm 패키지 설치

RUN npm install --silent
  • pip 패키지 설치
RUN pip install -r requirements.txt

 

ENTRYPOINT

* 이미지를 컨테이너로 띄울때 항상 실행해야 하는 명령어 지정시 사용

* 컨테이너 수행 목적에 따라 절대 변경되지 않을 명령어 사용

 

ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
ENTRYPOINT <전체 커맨드>
  • npm start 스크립트 실행
ENTRYPOINT ["npm", "start"]
  • Django 서버 실행
ENTRYPOINT ["python", "manage.py", "runserver"]

CMD

* 이미지를 컨테이너로 띄울때 디폴트로 실행할 명령어, ENTRYPOINT로 지정된 명령어에 기본으로 넘길 값을 지정할때 사용

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

* ENTRYPOINT로 명령어 지정 후 기본 값을 지정해주면 유연하게 사용이 가능 합니다.

ex) node 명령어로 기본으로는 'index.js'를 실행하되, docker run 명령어에 값을 실행 하고 싶은 경우 다음과 같이 Dockerfile 작성 합니다.

ENTRYPOINT ["node"]
CMD ["index.js"]

그러면 다음과 같이 docker run 커맨드의 인자 유무에 따라 node 커맨드로 다른 파일이 실행되게 할 수 있습니다.

  • node index.js 실행
$ docker run test
  • node main.js 실행
$ docker run test main.js

 

CMD 명령문과 RUN 명령문이 햇갈릴 수가 있는데, RUN 명령문은 이미지 빌드 시 항상 실행되며, 한 Dockerfile에 여러 개의 RUN 명령문을 선언할 수 있습니다. 반면에, CMD 명령문은 이미지를 continaer로 띄울 때 딱 한 번 실행 기회를 가지게 되며, 이 기회마저도 docker run 커맨드에 인자를 넘길 경우 상실하게 됩니다.

예를 들어, 다음과 같이 Dockerfile 파일에 "hello, world!!"를 출력하는 CMD 명령문이 있을 때

인자 없이 이미지를 실행하면 "hello, world!!"가 출력되지만, 값을 실행 될 명령어로 넘기면 해당 값이 출력되는 것을 알 수 있습니다.

FROM ubuntu
CMD ["echo", "hello, world!!"]
결과 화면
 

EXPOSE

* 네트워크 상에서 컨테이너로 들어오는 트래픽(traffic)을 리스닝(listening)하는 포트와 프로토콜을 지정하기 위해 사용

* 프로토콜은 TCP, UDP를 선택이 가능 하며 기본 TCP 입니다.

* 주의 사항 : 지정한 컨테이너 내에서만 유효하며, 호스트(host) 에서 이 포트를 접근을 하기 위해서는 docker run 명령어 실행시 -p 옵션을 통해 host 특정포트를 지정하여 컨테이너 지정 포트를 연결 할 수 있도록 포트를 연결 해줘야 합니다.

EXPOSE <포트>
EXPOSE <포트>/<프로토콜>
  • 80/TCP 포트로 리스닝
EXPOSE 80
  • 9999/UDP 포트로 리스닝
EXPOSE 9999/udp

 

COPY / ADD

* COPY : host pc에 있는 디렉터리 또는 파일을 Docker 이미지 파일안으로 복사하기 위해 사용, 절대 경로와 상대 경로를 모두 지원합니다. (상대 경로 사용시 WORKDIR 로 현재 작업디렉터리 경로를 고려해야 합니다.)

* ADD : 일반 파일 뿐만 아니라 압축 파일 또는 네트워크상의 파일도 사용할 수 있으나 특수 파일외 일반 파일은 COPY 명령어 사용을 권장 합니다.

COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
  • package.json 파일만 복사
COPY package.json package.json
  • 이미지를 빌드한 디렉터리의 모든 파일을 컨테이너의 app/ 디렉터리로 복사
WORKDIR app/
COPY . .

 

ENV

* 이미지내 환경 변수 설정하기 위해 사용

* 설정된 환경 변수는 이미지 빌드시에 사용

* 해당 컨테이너에서 실행 되는 어플리케이션도 접근 할 수 있습니다.

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

 

  • TZ 환경 변수를 Asia/Seoul 로 설정
ENV TZ=Asia/Seoul

 

ARG

* docker build 명령어로 이미지를 빌드 시 "--build-arg" 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용합니다.

ARG <이름>
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}

.dockerignore 파일

명령문은 아니지만 .dockerignore 파일도 알아두면 Dockerfile을 작성할 때 유용합니다. Docker 이미지를 빌드할 때 제외 시키고 싶은 파일이 있다면, .dockerignore 파일에 추가해주면 됩니다.

예를 들어, .git 디렉터리와 마크다운(markdown) 파일을 모두 제외 시키고 싶다면 다음과 같이 .dockerignore 파일을 작성해주면 됩니다.

  • .dockerignore
.git
*.md

이렇게 설정을 해주면 Docker는 프로젝트 최상위 디렉터리에 위치하고 있는 markdown 파일들을 무사하게 되므로, RUN과 CMD, COPY와 같은 명령문이 해당 파일을 사용할 수 없게 됩니다.

정리

지금까지 설명드린 Dockerfile의 명령어를 정리해보면 다음과 같습니다.

명령어용도
FROM base 이미지 설정
WORKDIR 작업 디렉터리 설정
RUN 이미지 빌드 시 커맨드 실행
ENTRYPOINT 이미지 실행 시 항상 실행되야 하는 커맨드 설정
CMD 이미지 실행 시 디폴트 커맨드 또는 파라미터 설정
EXPOSE 컨테이너가 리스닝할 포트 및 프로토콜 설정
COPY/ADD 이미지의 파일 시스템으로 파일 또는 디렉터리 복사
ENV 환경 변수 설정
ARG 빌드 시 넘어올 수 있는 인자 설정

Dockerfile(전체 명령어 확인) 명령어 정리 Reference URL : Dockerfile reference

 

Dockerfile reference

 

docs.docker.com

 

참고 URL : https://www.daleseo.com/dockerfile/

728x90
Comments