티스토리 뷰
지난 글에서 Dockerfile 을 활용하여 이미지를 빌드해 보았다. 리액트 프로젝트를 클론 받아 Dockerfile 을 추가하여 빌드하였는데, 이번 글에서는 Dockerfile 에 대해 더 자세히 알아보도록 한다.
우선 Dockerfile 에 대한 사항은 공식 페이지에서도 확인할 수 있다.
https://docs.docker.com/engine/reference/builder/
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 값의 변경 여부를 체크하기가 굉장히 어려워진다. 사용은 지양하는 것이 좋다.
'인프라 > Docker' 카테고리의 다른 글
도커허브 (DockerHub) 저장소 활용하기 [2022 ver.] (0) | 2022.02.14 |
---|---|
도커 이미지 압축 저장 및 불러오기 (0) | 2022.02.13 |
도커 이미지 빌드 (0) | 2022.02.11 |
도커 컨테이너 로그 (0) | 2022.02.10 |
도커 컨테이너 네트워크 (0) | 2022.02.09 |
- Total
- Today
- Yesterday
- 스타트업
- EC2
- dockerhub
- entrypoint
- uiux
- main
- DESIGN
- dockerfile
- cmd
- Material
- ecr
- 메터리얼
- Java
- 머티리얼
- 디자인
- HCL
- Terraform
- 자바
- 안드로이드
- docker
- env
- 테라폼
- 자료형
- 자격증명
- Operator
- 도커
- Android
- 컨테이너
- Container
- AWS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |