Docker

[Docker] Dockerfile (2)

ozofweird 2020. 11. 20. 20:17

1. 환경 및 네트워크 설정

1) 환경 변수 설정

Dockerfile에 환경 변수를 설정할 때는 ENV 명령을 사용한다.

ENV [키] [값]
ENV [키]=[값]

[키] [값] 형태의 경우 ENV 명령이 여러줄에 거쳐있기에 3개의 도커 이미지를 겹쳐 만들게 된다. 반면, [키]=[값] 형태의 경우 하나의 ENV 명령으로 설정하기에 도커 이미지는 하나로 생성된다. ENV 명령으로 지정한 환경변수는 컨테이너 실행 시의 '--env'을 사용하여 변경할 수 있다.

ENV myName "test"
ENV myNickName "oz"

ENV myName="test" \
    myNickName="oz"

2) 작업 디렉토리 지정

Dockerfile에서 정의한 명령을 실행하기 위한 작업용 디렉토리는 WORKDIR 명령을 사용하여 지정한다. 이 명령은 Dockerfile에 쓰여있는 RUN, CMD, ENTRYPOINT, COPY, ADD 명령을 실행하기 위한 작업용 디렉토리를 의미한다. 지정한 디렉토리가 없을 경우, 새로 작성한다. 이 명령은 Dockerfile에 여러 번 사용할 수 있다.

# 작업용 디렉토리 경로 /first/second/third
WORKDIR /first
WORKDIR second
WORKDIR third

# ENV 명령을 이용한 작업 경로 설정
ENV DIRPATH /first
ENV DIRNAME second
WORKDIR $DIRPATH/$DIRNAME

3) 사용자 지정

이미지 실행이나 Dockerfile의 RUN, CMD, ENTRYPOINT 같은 명령을 실행하기 위한 사용자 지정은 USER 명령을 이용한다. USER 명령에서 지정하는 사용자는 RUN 명령으로 미리 작성해 놓아야한다.

USER [사용자명]

RUN ["adduser", "test"]
RUN ["whoami"]
USER test
RUN ["whoami"]

4) 라벨 지정

이미지에 버전 정보, 작성자 정보, 코멘트 등 정보를 제공할 때 LABEL 명령을 사용한다.

LABEL [키명]=[값]

LABEL maintainer "test<test@gmail.com>"
LABEL title="title"
LABEL version="1.0"
LABEL description="discription"
sudo docker image inspect --format="{{ .Congig.Labels }}" label-test

5) 포트 설정

컨테이너의 공개 포트 번호를 지정할 때 EXPOSE 명령을 사용한다. EXPOSE 명령은 도커에게 실행 중인 컨테이너가 listen하고 있는 네트워크를 알려준다. 도커 컨테이너를 가동시킬 때에는 '-p' 옵션으로 어떤 포트를 호스트에 공개할지 정의한다.

EXPOSE [포트 번호]

6) Dockerfile 변수 설정

Dockerfile 안에서 사용할 변수를 정의할 때는 ARG 명령을 사용한다. ENV와 다르게 Dockerfile 내에서만 사용이 가능하다. Dockerfile을 빌드할 때에는 '--build-arg' 옵션을 붙여 ARG 명령에서 지정한 값을 설정하고 명령을 실행한다.

ARG [이름]=[값]

// 기본값 설정
ARG TEST="test"
RUN echo $TEST
sudo docker build . --build-arg TEST=test2

7) 기본 Shell 설정

Shell 형식으로 명령을 수행할 때의 기본 Shell 설정은 SHELL 명령을 사용한다.

SHELL ["Shell 경로", "파리미터"]

// Linux
SHELL ["/bin/bash", "-c"]

// Windows
SHELL ["cmd", "/S", "/C"]

 

 

 

2. 파일 설정

1) 파일 및 디렉토리 추가

이미지에 호스트상의 파일이나 디렉토리를 추가할 경우 ADD 명령을 사용한다. 호스트 파일 경로에는 와일드카드와 GO 언어의 filepath, match 룰과 일치하는 패턴(*, ?)을 사용할 수 있다.

ADD [호스트 파일 경로] [도커 파일 경로]
ADD ["호스트 파일 경로" "도커 파일 경로"]

도커 이미지 내부의 파일은 절대 경로로 지정하거나 WORKDIR 명령으로 경로를 지정하여 사용할 수 있다. 즉, ADD 명령으로 호스트 파일이 '작업 경로/도커 파일 경로' 하위에 추가가된다.

WORKDIR [도커 작업 경로]
ADD [호스트 파일 경로] [도커 파일 경로]

이미지에 추가하고 싶은 파일이 원격 파일 URL인 경우에는 추가한 파일은 사용자만 읽고 쓰기가 가능한 600 권한을 가진다. 만약 원격 파일이 HTTP Last-Modified 헤더를 가지고 있다면 추가된 파일에서 mtime의 값으로 사용된다. ADD 명령은 인증을 지원하지 않기 때문에 원격 파일의 다운로드에 인증이 필요한 경우에는 RUN 명령에서 wget 이나 curl 명령을 사용해야한다.

 

URL로 파일을 다운받을 때 디렉토리일 경우에는 파일명은 URL로 지정한 것이 된다. 또한 호스트의 파일이 tar 아키이브이거나 압축 포맷일 경우 디렉토리로 압축을 푼다. 단, 원격 URL로부터 다운로드한 리소스는 압축이 풀리지 않는다.

2) 불필요한 파일 제외

도커에서 빌드를 수행할 때 디렉토리 아래에 있는 모든 파일이 도커 데몬으로 전송이된다. 이 경우 '.dockerignore' 이름의 파일 안에 해당 파일명을 기술하여 불필요한 파일을 제외한다. 사용 방법은 '.gitignore'와 동일하다.

3) 파일 복사

이미지에 호스트상의 파일이나 디렉토리를 복사할 경우에는 COPY 명령을 사용한다. ADD 명령과 비슷하나 ADD 명령은 원격 파일의 다운로드나 아카이브의 압축 해제 등과 같은 기능을 보유하고 있다. 반면 COPY 명령은 호스트상의 파일을 이미지 안으로 복사하는 처리만 수행한다.

COPY [호스트 파일 경로] [도커 파일 경로]
COPY ["호스트 파일 경로", "도커 파일 경로"]

4) 볼륨 마운트

이미지에 볼륨을 할당할 경우 VOLUME 명령을 사용한다. 마운트 포인트를 지정하여 호스타나 그 외 다른 컨테이너로부터 볼륨의 외부 마운트를 수행한다. VOLUME ["/var/log"]와 같은 JSON 배열이나 VOLUME /var/log, VOLUME /var/log/db와 같은 ㅇ러 개의 인수된 문자열을 지정할 수 있다.

VOLUME ["/마운트 포인트"]

※ 컨테이너는 영구 데이터를 저장하는 데는 적합하지 않다. 따라서 영구 저장이 필요한 데이터는 컨테이너 밖의 스토리지에 저장하는 것이 좋다. 영구 데이터는 도커의 호스트 머신상의 볼륨에 마운트하거나 공유 스토리지를 볼륨으로 마운트 하는 것이 가능하다.


[참고] 완벽한 IT 인프라 구축을 위한 Docker (2판)

728x90