Dockerfile 에 대하여

Dockerfile 에 대하여

Dockerfile 에 대하여 이해하고 이를 작성 할 수 있도록 기본 개념을 이해해 본다.

개요

Dockerfile은 사용자가 이미지를 조합하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서이며

사용자는 docker build 명령어를 통해 문서를 실행하여 자동화된 이미지를 build 할 수 있다.

Dockerfile 작성법

  • 텍스트 형태로 작성 됨
  • 여러가지 사용 명령 Keyword 를 제공하며 이를 바탕으로 작성한다.
Keyword설명
FROM새빌드 단계를 초기화 후속 명령에 대한 기본 이미지 다운로드
LABEL버전 정보, 작성자와 같은 이미지 설명을 작성하기 위한 명령
RUN쉘 명령을 실행하는 명령
CMDdocker 컨테이너가 시작할 때, 실행하는 쉘 명령을 지정하는 명령.
ENTRYPOINTdocker 컨테이너가 시작할 때 실행하는 쉘 명령 CMD 와 비슷하지만 다른점은 docker run 시 오버라이딩 되지 않으며 값을 인자로 받음
ENV환경 변수 지정
WORKDIR작업 dir 설정 run 이후에 docker exec 명령어로 내부에 접근 시 이 폴더에 위치
EXPOSE외부에 노출될 포트설정
COPY파일을 복사
ADD파일을 복사 하는 명령어로 기존 동일 파일이 있으면 오버라이딩이 안되며 자동으로 압축을 풀어주는 행위를 함
ARGdockerfile 내에서 사용할 변수지정
USER시스템 사용자 ID를 지정

FROM

새 빌드 단계를 초기화하고 후속 명령어에 대한 기본 이미지를 설정합니다. FROM 에 설정된 이미지는 모든것을 지정할 수 있으며 Public Repositories 에서 이미지를 검색후 명시하면 그 베이스 이미지 부터 사용 됩니다.

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]

LABEL

이미지에 메타데이터를 추가 할 때 사용

# 기본문법
LABEL <key>=<value> <key>=<value> <key>=<value> ...

# 사용방법
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."

RUN

현재 이미지 위에 명령어를 실행하여 결과를 커밋하여 새로운 이미지를 반환 다음 단계의 RUN 에 사용 이미지를 계층화 할 때 사용하는 명령어라고 이해

# 기본문법
RUN <command> or RUN ["executable", "param1", "param2"]

# 사용 방법
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
RUN ["/bin/bash", "-c", "echo hello"]

CMD

CMD 의 주요 목적은 실행 컨테이너에 대한 기본값을 제공하는 것. 여러개의 CMD 를 한파일에 작성하면 마지막 항목만 CMD 에 적용됩니다.

CMD ["executable","param1","param2"]( exec 형식, 선호하는 형식)
CMD ["param1","param2"]( ENTRYPOINT에 대한 기본 매개변수로 )
CMD command param1 param2( 쉘 형태)

ENTRYPOINT

CMD 와 비슷하지만 docker run 수행 시 해당 command 가 유지 되어 사용되어야 할 때 사용 됩니다.

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

COPY

COPY 명령은 에서 새 파일이나 디렉토리를 복사 하여 경로에 있는 컨테이너의 파일 시스템에 추가합니다.

–chown 기능은 Linux 컨테이너를 빌드하는 데 사용되는 Dockerfile 에서만 지원되며 Windows 컨테이너에서는 작동하지 않습니다. 사용자 및 그룹 소유권 개념은 Linux 와 Windows 간에 변환되지 않으므로 사용자 및 그룹 이름을 ID로 변환하는 데 /etc/passwd 및 /etc/group 를 사용하면 이 기능이 Linux OS 기반 컨테이너에서만 실행 가능하도록 제한됩니다. ```shell COPY [–chown=:] ... COPY [--chown=:] ["",... ""]

COPY test.txt /absoluteDir/

### EXPOSE
EXPOSE 명령은 컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기함을 Docker 에 알립니다. 포트가 TCP 또는 UDP 에서 수신 대기하는지 여부를 지정할 수 있으며 프로토콜이 지정되지 않은 경우 기본값은 TCP 입니다.

```shell
EXPOSE <port> [<port>/<protocol>...]

EXPOSE 80/udp

# 사용
docker run -p 80:80/tcp -p 80:80/udp ...

Dockerfile 실행법

# 도커 공식홈페이지 예제
docker build -f /path/to/a/Dockerfile .

# 요약
docker build 옵션 [도커파일 경로]

| 옵션 | 설명 | |—–|:————————————| | -t | 이미지 태그 설정, 이미지이름:태그 형태로 이미지 name 설정 | | -f | 이미지 빌드시 Dockerfile 의 명칭을 명시할 때 사용 |

실행실습

# docker image name 이  test 이며 버전은 14 버전의 이미지이며 dockerfile 이름은 test_14_dockerfile 이다.
docker build -t test:14 -f test_14_dockerfile ./

© 2021. All rights reserved.