ggoggo

[Docker] Dockerfile 본문

Infra/Docker

[Docker] Dockerfile

chchae01 2023. 12. 3. 17:08

 

Dockerfile이란

Docker Image를 생성하기 위한 설정 파일이다. 파일 내 작성된 구문으로 Docker Image가 만들어진다.

Dockerfile 문법

Dockerfile ref

FROM

FROM <image>:<tag>
FROM ubuntu:16.04
  • 베이스 이미지를 지정한다.
  • 반드시 지정해야 하며 어떤 이미지도 베이스 이미지가 될 수 있다
  • tag는 될 수 있으면 latest(기본값)보다는 구체적인 버전(16.04 등)을 지정하는 것이 좋다

MAINTAINER

MAINTAINER <name>
MAINTAINER chaechae01@gmail.com
  • Dockerfile을 관리하는 사람의 이름 또는 이메일 정보를 적는다.
  • 빌드에 영향을 주지는 않는다.

COPY

COPY <src>... <dest>
COPY . /usr/src/app
  • 파일이나 디렉토리를 이미지로 복사한다.
  • 일반적으로 소스를 복사하는데 사용한다.
  • target 디렉토리가 없다면 자동으로 생성한다.

ADD

ADD <src>... <dest>
ADD . /usr/src/app
  • COPY 명령어와 매우 유사하자 추가 기능이 있다.
  • src에 파일 대신 URL을 입력할 수 있고 src에 압축 파일을 입력하는 경우 자동으로 압축을 해제하면서 복사된다.

RUN

RUN <command>
RUN ["executable", "param1", "param2"]
RUN bundle install
  • 가장 많이 사용하는 구문이다.
  • 명령어를 그대로 실행한다.
  • 내부적으로 /bin/sh -c 뒤에 명령어를 실행하는 방식이다.

CMD

CMD ["executable","param1","param2"]
CMD command param1 param2
CMD bundle exec ruby app.rb
  • 도커 컨테이너가 실행되었을 때 실행되는 명령어를 정의한다.
  • 빌드할 때는 실행되지 않으며 여러개의 CMD가 존재할 경우 가장 마지막 CMD만 실행한다.
  • 한꺼번에 여러개의 프로그램을 실행하고 싶은 경우에는 run.sh 파일을 작성하여 데몬으로 실행하거나 supervisord나 forego와 같ㅇ느 여러개의 프로그램을 실행하는 프로그램을 사용한다.

WORKDIR

WORKDIR /path/to/workdir
  • RUN, CMD, ADD, COPY 등이 이루어질 기본 디렉토리를 설정한다.
  • 각 명령어의 현재 디렉토리는 한 줄 한 줄마다 초기화되기 때문에 RUN cd /path를 하더라도 다음 명령어에선 다시 위치가 초기화된다.
  • 같은 디렉토리에서 계속 작업하기 위해서 WORKDIR을 사용한다.

EXPOSE

EXPOSE <port> [<port>...]
EXPOSE 4567
  • 도커 컨테이너가 실행되었을 때 요청을 기다리고 있는 (Listen) 포트를 지정한다.
  • 여러개 지정 가능

 

VOLUME

VOLUME ["/data"]
  • 컨테이너 외부에 파일 시스템을 마운트 할 때 사용한다.
  • 반드시 지정하지 않아도 마운트할 수 있지만, 기본적으로 지정하는 것이 좋다.

ENV

ENV <key> <value>
ENV <key>=<value> ...
ENV DB_URL mysql
  • 컨테이너에서 사용할 환경변수를 지정한다.
  • 컨테이너를 실행할 때 -e 옵션을 사용하면 기존 값을 오버라이딩 하게 된다.
구문 설명
# 코멘트
FROM 베이스 이미지(Base Image) 지정
MAINTAINER 이미지를 생성한 사람의 이름 및 정보
LABEL Key-value 형식으로 작성된 메타 데이터
RUN 컨테이너 빌드를 위한 실행 Commands
COPY 컨테이너 빌드시 호스트 파일을 복사
ADD 컨테이너 빌드시 호스트의 (tar,url)을 복사
WORKDIR 컨테이너 빌드시 명령이 실행될 작업 디렉토리
ENV 환경 변수
USER 명령 및 컨테이너 실행시 적용할 유저설정 ( 기본: root )
VOLUME 컨테이너 내의 특정 디렉토리를 컨테이너 외부 경로에 마운트
EXPOSE 컨테이너 동작 시 외부에서 사용할 포트 지정
CMD 컨테이너 동작 시 자동으로 실행할 서비스 및 스크립트 지정
ENTRYPOINT CMD와 함께 사용하면서 Command 지정 시 사용

 

참고