반응형
05-14 05:47
Today
Total
«   2024/05   »
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
관리 메뉴

개발하는 고라니

[Docker] Dockerfile과 Build 본문

Open Source/Docker

[Docker] Dockerfile과 Build

조용한고라니 2021. 10. 2. 17:07
반응형

도커를 이용해 image를 pull받고 그것을 run 하게 되면, container가 생성되고 실행되게 된다. 반대로, 이 container를 image로 만드는 방법 또한 존재한다. commit과 build가 있는데 build에 대해 중점적으로 알아보자.

Docker 이미지 만드는 법

도커 이미지를 만드는 방법에는 2가지가 존재한다.

1) commit

2) build

 

(1) commit 의 방법은 간단히 컨테이너를 사진을 찍어 image로 만드는 것이고, 여기선 다루지 않겠다.

(2) build의 방법은 "Dockerfile"이라는 파일을 만들어 이미지를 만드는 방법이다. 이를 이용하면 컨테이너가 어떻게 만들어지는지 분명하게 알 수 있다는 장점이 있다.

우리가 만들고 싶은 이미지에 대해 도커파일의 형식에 맞게 위와같이 적어주고, 'build' 명령어를 주면 도커파일을 바탕으로 새로운 이미지를 만들게 된다.

commit vs build

둘의 차이는 무엇일까. 결과적으로 이미지를 만드는 명령이라는 점은 동일하다.

 

commit은 이미 사용하고 있는 컨테이너가 있을 때 그것을 이미지로 만드는, 백업의 개념이다.

 

build는 도커 파일을 이용해 구체적으로, 시간의 순서에 따라 이미지를 생성하는 개념이다.

build

docker build [OPTIONS] PATH | URL | -

도커를 빌드할 때 OPTIONS에 들어갈 수 있는 옵션에 상세한 내용은 여기에서 찾아볼 수 있다. 도커 빌드 명령은 ㄷ

옵션 설명
--file, -f 도커파일의 이름(default = PATH/Dockerfile)
--memory, -m 메모리 제한
--tag, -t 이름 및 선택적으로 'name:tag'형식의 태그
--pull 항상 최신 버전의 이미지를 가져오려고 시도한다.

Dockerfile

 

Dockerfile reference

 

docs.docker.com

도커파일은 사용자가 image를 조합하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 '텍스트 문서'이다. 도커파일이 위치한 곳에서 [ docker build . ]를 입력하면 존재하는 도커파일을 바탕으로 이미지가 만들어지게 된다.

 

형식

  • 명령은 대소문자를 구분하지 않으나, 관례는 대문자를 사용한다.
  • 도커파일에 명시된 순서대로 실행하게 된다.
  • FROM으로 시작한다.
  • 주석은 '#' 뒤에 작성한다. (예: #comment)

FROM

[FROM] 명령은 새로운 빌드 단계를 초기화하고 기본 이미지를 설정한다. 따라서 도커파일은 FROM으로 시작해야한다. 

  • [ARG]는 [FROM]앞에 올 수 있는 유일한 명령이다.
  • [FROM] 명령어는 이전 명령어에 의해 생성된 모든 상태를 지운다.
  • 선택적으로 'AS name'를 추가해 새 빌드 단계에 이름을 지정할 수 있다.
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app

FROM extras:${CODE_VERSION}
CMD /code/run-extras

RUN

RUN은 이미지가 빌드되는 시점에 실행되는 명령어이고, 이미지에 반영이 된다.

 

[RUN]에는 2가지 형식이 있다. 

- RUN <command>

- RUN ["executable", "param1", "param2"]

RUN /bin/bash -c 'source $HOME/.bashrc; \ echo $HOME'
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
# 백슬래시 (\)를 사용함으로써 다음 줄의 명령을 계속 실행할 수 있다.

ex)
RUN ["/bin/bash", "-c", "echo hello"]

RUN apt-update && apt install -y python3

CMD

CMD는 컨테이너가 실행될 때 실행되는 명령어로, 컨테이너에 반영된다.

 

[CMD]에는 3가지 형태가 있다.

- CMD ["executable", "param1", "param2"]

- CMD ["param1", "param2"]

- CMD command param1 param2 

 

도커파일에는 오직 1개의 [CMD]명령어만 있을 수 있다. 둘 이상 나열하면 마지막 항목만 적용된다.

[CMD]의 주요 목적은 실행 컨테이너에 대한 기본값을 제공하는 것이다.

#ex
FROM ubuntu
CMD echo "This is a test." | wc -

FROM ubuntu
CMD ["/usr/bin/wc","--help"]

FROM ubuntu:20.04
RUN apt-update && apt install -y python3
WORKDIR /var/www/html
COPY ["index.html", "."]
CMD ["python3", "-u", "-m", "http.server"]

LABEL

[LABEL]명령은 이미지에 메타데이터를 추가한다. 키-값 쌍이며 [LABEL] 값 내에 공백을 포함하려면 따옴표(,)와 백슬래시(\)를 이용한다.

#ex
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \ that label-values can span multiple lines."

COPY

[COPY]에는 2가지 형식이 있다.

- COPY [--chown=<user>:<group>] <src>... <dest>

- COPY [--chown=<user>:<group>] ["<src>", ... "<dest>"]

 

[COPY]명령은 <src>로부터 새 파일 또는 디렉토리를 복사하고, 컨테이너의 <dest> 파일시스템에 추가한다.

#ex
COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY test.txt relativeDir/
COPY test.txt /absoluteDir/

WORKDIR

- WORKDIR /path/to/workdir

 

[WORKDIR]명령은 RUN, CMD, ENTRYPOINT, COPY 및 ADD명령에 대해 작업 디렉토리를 설정한다. [WORKDIR]은 여러번 실행할 수 있다. 상대경로가 주어지면 이전 WORKDIR의 경로를 기준으로 한다.

#ex
WORKDIR /a
WORKDIR b
WORKDIR c

 

더 자세한 도커파일의 정보는 여기에서 확인할 수 있다.

 

#References

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

생활코딩 유튜브 - 도커 : 이미지 만드는 법 - Dockerfile & build

반응형

'Open Source > Docker' 카테고리의 다른 글

[Docker] 도커 호스트와 컨테이너  (0) 2021.09.28
[Docker] 기초 사용법과 개념  (2) 2021.09.28
Comments