티스토리 뷰

지난 글에서 Dockerfile 을 활용하여 이미지를 빌드해 보았다. 리액트 프로젝트를 클론 받아 Dockerfile 을 추가하여 빌드하였는데, 이번 글에서는 Dockerfile 에 대해 더 자세히 알아보도록 한다.

 

우선 Dockerfile 에 대한 사항은 공식 페이지에서도 확인할 수 있다.

https://docs.docker.com/engine/reference/builder/ 

 

Dockerfile reference

 

docs.docker.com

 

 

Format - 주석

Dockerfile 내에서 주석은 파이썬과 동일하게 샵 (#) 을 이용하여 주석을 추가할 수 있다.

# Comment

 

Format - 지시어

Dockerfile 의 모든 구문은 지시어와 그 지시어의 인자값으로 이루어져 있다.

INSTRUCTION arguments

 

예를 들면 다음과 같다.

RUN echo 'we are running some # of cool things'

 

환경변수

다음은 Docker 공식 문서의 환경변수 예시 구문이다.

FROM busybox
ENV FOO=/bar
WORKDIR ${FOO}   # WORKDIR /bar
ADD . $FOO       # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux

 

WORKDIR 과 ADD 지시어에 $FOO 라는 환경변수를 사용하고 있는 것을 볼 수 있다. 여기서 FOO 는 컨테이너의 환경 변수이다.

ENV 지시어를 사용하면 이미지 빌드 타임과 컨테이너 런타임에 환경 변수 값을 전달할 수 있다. 예시를 보면 FOO 라는 환경변수에 "/bar" 라는 문자열을 넣은 것을 확인할 수 있다.

그러면 아래에서 $FOO 라는 환경변수를 통해 "/bar" 라는 문자열을 이용할 수 있다.

 

 

Build Argument ARG

환경 변수를 전달하는 방법 대신 Build argument 를 전달하는 방법도 있다. ARG 지시어를 통해 전달하는 방법이다. 기본 형식은 다음과 같다.

ARG <name>[=<default value>]

 

아래 예시와 같이 정의할 수 있다. Dockerfile 상에서 사용할 변수명들을 정의하고 있다.

FROM busybox
ARG user1
ARG buildno

 

위와 같이 정의를 하면 해당 값을 전달해야 하는데, 전달하는 방법은 두 가지가 있다.

# Dockerfile 에서 기본 값 전달하기
FROM busybox
ARG user1=someuser
ARG buildno=1

# docker build 명령어를 통해 arguments 전달하기
docker build --build-arg CONT_IMG_VER=v2.0,1 .

 

Build Arguments 를 활용할 때에는 Scope 에 대해서도 유의해야 하는데, ARG 를 사용하기 전에 반드시 ARG 지시어를 통해 정의해야 한다. 예를 들어 다음과 같이 ARG 가 정의되기 전에 user 라는 값을 사용하면,

FROM busybox
USER ${user:-some_user}
ARG user
USER user

 

이 경우 user 변수가 정의되어 있지 않기 때문에 build 명령어를 통해 ARG를 넘겨주더라도 값을 불러오는 것이 아니라, 정의되지 않은 변수이기 때문에 기본값을 사용하게 된다.

 

또한, ARG 와 ENV 가 동일한 형식을 가지기 때문에, 동일한 이름에 대해 ARG와 ENV 가 모두 정의되어 있는 경우에는 항상 ENV 지시어가 ARG 지시어를 덮어쓰게 된다.

 


 

이제 기본적인 지시어에 대해 알아보았으니, 예시 Dockerfile 을 토대로 명령들을 해석해 보자.

FROM node:16
LABEL maintainer="wkdgus1164 <wkdgus1164@naver.com>"
LABEL description="Simple server with Node.js"

# Create app directory
WORKDIR /app

# Install app dependencies
COPY package*.json ./

RUN npm install
COPY . .

EXPOSE 8080
CMD ["node", "server.js"]

 

FROM

어떤 베이스 이미지를 사용할지 결정한다. 이 예제에서는 node 16 버전 이미지를 사용한다.

 

LABEL

이미지의 메타데이터를 설정한다. 기본적으로 선택 값이므로 명시하지 않아도 된다.

 

WORKDIR

인자의 경로를 Working Directory 로 지정한다. (/app) 이미지 빌드 시에 이미지 내에서 설정된다.

 

COPY

[SRC] [DESTINATION] 의 형식이다.

  • SRC : 호스트 OS 상 경로
  • DESTINATION : 이미지 상 경로
  • 호스트 OS 상 경로의 "package" 로 시작하고 ".json" 으로 끝나는 모든 파일을 이미지 상 기본 경로 (/app) 에 복사한다.

 

RUN

이미지 빌드 상에서 해당 명령어를 실행한다.

 

COPY . . 

'.'은 현재 디렉토리를 의미한다. 현재 호스트 OS의 디렉토리의 모든 파일을 이미지 상 경로에 모두 복사한다.

소스 코드의 변경 사항을 npm install 을 진행한 이후에 실행하기 위함이다.

 

EXPOSE

도커 이미지가 해당 포트를 사용한다는 의미의 문서화 목적의 명시 지시어이다.

publish 를 할 때에는 build 시에 -p 옵션을 주어서 명시해야 한다.

 

CMD

해당 이미지를 가지고 컨테이너를 실행할 때 어떤 명령어를 실행할 것인지 결정한다.

배열 형태로도 정의가 가능하지만, 하나의 문자열 형태로도 정의가 가능하다. 사용법에 따라 장단점이 다르다.

 


ENTRYPOINT

컨테이너가 실행되기 전 실행되는 명령이다. 이전 글에서도 살펴본 적이 있는데, Dockerfile 내에도 정의할 수 있다.

# 다음과 같이 배열 형태로 전달할 수 있다.
ENTRYPOINT ["executable", "param1", "param2"]

# 다음과 같이 shell 형태 (문자열 형태) 로 전달할 수도 있다.
ENTRYPOINT command param1 param2

 

ADD

ADD 지시어는 COPY 지시어와 거의 동일한 역할을 수행한다. ADD 지시어는 SRC 디렉토리로 URL 도 받을 수 있다. 이 경우 SRC 값의 변경 여부를 체크하기가 굉장히 어려워진다. 사용은 지양하는 것이 좋다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함