Docker 기초 (11) - Dockerfile

이것저것 개발자·2022년 3월 23일
0

Docker 기초

목록 보기
11/17
post-thumbnail

Dockerfile 문법

https://docs.docker.com/engine/reference/builder/
공식 홈페이지

FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

Dockerfile 예시

# comment 주석은 # ~~

[INSTRUCTION] [arguments]
[지시어] [인자]

ENTRYPOINT

ENTRYPOINT ["executable", "param1", "param2"]

CMD를 쓰기에 앞서 시작프로그램을 지정

USER

USER <user>[:<group>]
USER <UID>[:<GID>]

컨테이너가 사용하게 될 기본 사용자 지정

ENV 환경변수

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

ENV 지시어를 사용해서 FOO라는 환경변수에 /bar라는 스트링을 입력

ARG (Build Argument)

ARG <name>[=<defulat value>]

FROM busybox
ARG user1
ARG buildno
# ...

ARG 지시어를 통해 빌드에서 사용할 변수명을 정의할 수 있다.
이렇게 정의한 변수에 값을 넣는 방법은 2가지인데

docker build --build-arg user=what_user .

도커빌드 명령어 시 --build-arg를 함께 쓰는 방법과

ARG user1=someone

변수와 값을 함께 정의하는 방법이다.

ENV와 ARG가 함께 사용될 경우

FROM ubuntu
ARG CONT_IMG
ENV CONT_IMG=v1.0.0
RUN echo $CONT_IMG

ENV와 ARG가 같은 변수명을 사용할 경우 항상 ENV가 값을 덮어쓰게된다.

Dockerfile 분석

FROM node:16
LABEL maintainer="Simon Jo <ghdud0503@gmail.com>"
LABEL description="Server with Node.js"

# Create app directory
WORKDIR /app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

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

지시어를 한줄씩 풀어보자

FROM node:16

베이스 이미지

LABEL maintainer="Simon Jo <ghdud0503@gmail.com>"
LABEL description="Server with Node.js"

이미지의 메타데이터
추후 컨테이너 관리용

WORKDIR /app

지시어 다음에 오는 경로를 워킹디렉토리로 사용

COPY package*.json ./

COPY [호스트의 경로][이미지내에서의 경로]

RUN npm install

해당 명령어를 실행

COPY . .

현재 디렉토리의 모든 파일을 app디렉토리(워킹디렉토리)에 모두 복사

COPY가 두개 있는 이유는 레이어 구분을 하기 위함
첫번째 COPY는 package.json에 있는 depecdency를 다운로드받고
두번째 COPY는 소스코드의 변경사항을 감지하기 위함이다.

EXPOSE 8080

8080 포트를 사용

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

컨테이너를 실행할 때 사용될 명령어

profile
조호영, Developing something

0개의 댓글