DevOps

[Docker] Dockerfile 환경 및 설정

nineDeveloper 2020. 3. 17. 14:32
728x90

Dockerfile 환경 및 설정

환경변수 설정(ENV 명령)

Dockerfile 안에서 환경변수를 설정하고 싶을 때 사용

ENV 명령

ENV [key] [value]
ENV [key]=[value]

1. key value로 지정하는 경우

단일 환경변수에 하나의 값을 설정함
첫 번째 공백 앞을 key로 설정하면 그 이후는 모두 문자열로 취급
공백이나 따옴표와 같은 문자를 포함한 것도 문자로 취급

명령별로 Docker 이미지를 만듬

ENV myName "Shiho ASA"
ENV myOrder Gin Whisky Calvados
ENV myNickName miya

2. key=value로 지정하는 경우

한 번에 여러 개의 값을 설정할 때는 환경변수를 key=value로 지정

Docker 이미지를 하나만 만듬

ENV myName="Shiho ASA" \
    myOrder=Gin\ Whisky\ Calvados \
    myNickName=miya
  • 변수 앞에 \를 추가하면 이스케이프 처리를 할 수 있음
    예를 들어 \$myName$myName 이라는 리터럴로 치환할 수 있음
  • ENV 명령으로 지정한 환경변수는 컨테이너 실행 시의 docker container run 명령의 --env 옵션을 사용하면 변경할 수 있음

작업 디렉토리 지정(WORKDIR 명령)

Dockerfile에서 정의 한 명령을 실행하기 위한 작업용 디렉토리를 지정할 때 사용

WORKDIR 명령

WORKDIR [작업 디렉토리 경로]

WORKDIR 명령은 Dockerfile에 쓰여 있는 다음과 같은 명령을 실행하기 위한 작업용 디렉토리를 지정

  • RUN 명령
  • CMD 명령
  • ENTRYPOINT 명령
  • COPY 명령
  • ADD 명령

만일 지정한 디렉토리가 존재하지 않으면 새로 작성함
WORKDIR 명령은 Dockerfile 안에서 여러 번 사용할 수 있음

절대 경로/상대 경로를 사용한 WORKDIR 명령

상대 경로를 지정한 경우는 이전 WORKDIR 명령의 경로에 대한 상대 경로가 됨

마지막 줄 실행 후 /first/second/third가 출력됨

WORKDIR /first
WORKDIR second
WORKDIR third
RUN ["pwd"]

WORKDIR 명령으로 환경 변수를 사용

WORKDIR 명령에는 ENV 명령에서 지정한 환경변수를 사용할 수 있음

마지막 줄 실행 후 /first/second가 출력됨

ENV DIRPATH /first
ENV DIRNAME second
WORKDIR $DIRPATH/$DIRNAME
RUN ["pwd"]

사용자 지정(USER 명령)

이미지 실행이나 Dockerfile의 다음과 같은 명령을 실행하기 위한 사용자를 지정할 때 사용

  • RUN 명령
  • CMD 명령
  • ENTRYPOINT 명령

USER 명령

USER [사용자명/UID]

USER 명령에서 지정하는 사용자는 RUN 명령으로 미리 작성해 놓을 필요가 있음

USER 명령 사용

첫 번째 whoami 명령은 root
두 번째 whoami 명령은 USER 명령으로 지정한 asa로 되어 있음

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

라벨 지정(LABEL 명령)

이미지에 버전 정보나 작성자 정보, 코멘트 등과 같은 정보를 제공할 때 사용

LABEL 명령

LABEL <키 명>=<값>

LABEL 명령 사용

LABEL maintainer "Shiho ASA<asashiho@mail.asa.seoul>"
LABEL title="WebAP"
LABEL version="1.0"
LABEL description="This image is WebApplicationServer"

Dockerfile을 빌드하여 생성된 sample이라는 이름의 이미지의 상세 정보를 확인하면
LABEL 명령으로 지정한 정보가 설정되어 있는 것을 알 수 있음

이미지의 상세 정보

구 버전 Docker에서는 Dockerfile의 작성자를 기술할 때 MAINTAINER 명령을 사용했었음
이 명령은 현재 권장하지 않으므로 LABEL 명령을 사용

docker image inspect --format="{{ .Config.Labels }}" label-sample
map [title:WebAP version:1.0 description:This image is WebApplicationServer maintainer:"Shiho ASA<asashiho@mail.asa.seour>"]

포트 설정(EXPOSE 명령)

컨테이너 공개 포트 번호를 지정할 때는 EXPOSE 명령을 사용

EXPOSE 명령

EXPOSE 명령은 Docker에게 실행 중인 컨테이너가 listen하고 있는 네트워크를 알려줌
docker container run 명령의 -p 옵션을 사용할 때 어떤 포트를 호스트에 공개할지를 정의 함

EXPOSE <포트 번호>

EXPOSE 명령 사용

EXPOSE 8080

Dockerfile 내 변수의 설정(ARG 명령)

Dockerfile 안에서 사용할 변수를 정의할 때 사용

ARG 명령

ARG 명령을 사용하면 변수의 값에 따라 생성되는 이미지의 내용을 바꿀 수 있음

ARG <이름> [=기본값]

ARG 명령 사용

# 변수의 정의
ARG YOURNAME="asa"
RUN echo $YOURNAME

ARG 명령 실행 예시1

ARG 변수값을 변경하여 빌드

docker build . --build-arg YOURNAME=shiho

ARG 명령 실행 예시2

ARG 기본값을 사용하여 빌드

docker build .

기본 쉘 설정(SHELL 명령)

쉘 형식으로 명령을 실행할 때 기본 쉘을 설정하기 위해 사용
SHELL 명령을 지정하지 않았을 때 기본 쉘

  • LINUX: ["/bin/sh", "-c"]
  • Windows: ["cmd", "/S", "/C"]

SHELL 명령

SHELL 명령을 지정하면 그 쉘은 그 이후에 Dockerfile 안에서 Shell 형식으로 지정한
RUN 명령이나 CMD 명령, ENTRYPOINT 명령에서 유효해짐

SHELL ["쉘의 경로", "파라미터"]

RUN 명령 실행

기본 쉘을 /bin/bash로 변경하여 RUN 명령을 실행

# 기본 쉘 지정
SHELL ["/bin/bash", "-c"]

# RUN 명령 실행
RUN echo hello

파일 및 디렉토리 추가(ADD 명령)

이미지에 호스트상의 파일이나 디렉토리를 추가할 때 사용

ADD 명령

ADD <호스트의 파일 경로> <Docker 이미지의 파일 경로>
ADD ["<호스트의 파일 경로>" "<Docker 이미지의 파일 경로>"]

ADD 명령 사용

ADD 명령은 호스트상의 파일이나 디렉토리, 원격 파일을 Docker 이미지 안으로 복사함

ADD host.html /docker_dir/

ADD 명령에 사용하는 패턴

추가하고 싶은 호스트의 파일 경로에는 Dockerfile의 디렉토리 내부를 지정해야 함
호스트의 파일 경로에는 와일드카드와 Go 언어의 filepath.Match 룰과 일치하는 패턴을 사용할 수 있음

# [host]로 시작하는 모든 파일을 추가
ADD hos* /docker_dir/

# [hos]+임의의 한 문자 룰에 해당하는 파일을 추가
ADD hos?.txt /docker_dir/

WORKDIR 명령과 ADD 명령 사용

Docker 이미지 안의 파일은 절대 경로로 지정하거나 WORKDIR 명령에서 지정한 디렉토리를 기점으로 한 경로로 지정함

/docker_dir/web 디렉토리에 host.html 파일을 복사하기 위한 명령

WORKDIR /docker_dir
ADD host.html web/

ADD 명령에서 원격 파일 추가

이미지에 추가하고 싶은 파일이 원격 파일 URL인 경우, 추가한 파일은 퍼미션이 600(사용자만 읽기 쓰기 가능)이 됨
만일 취득한 원격 파일이 HTTP Last-Modified(HTTP에서 콘텐츠의 데이터를 마지막으로 갱신한 날짜의 타임스탬프) 헤더를 갖고 있다면 추가된 파일에서 mtime의 값으로 사용됨

ADD 명령은 인증을 지원하지 않기 때문에 원격 파일의 다운로드에 인증이 필요한 경우는 RUN 명령에서 wget 명령이나 curl명령을 사용해야 함

ADD http://www.wing.msn.to/index.php /docker_dir/web/

ADD 명령에서 원격 파일을 추가한 실행결과

실행하면 http://www.wing.msn.to/index.php를 다운로드하여
Docker 이미지 안의 /docker_dir/web/index.php로 퍼미션이 600인 파일이 추가됨

docker build -t sample .

이미지 안의 파일 지정이 파일(마지막 슬래시가 아님)일 때는 URL로 부터 파일을 다운로드하여 지정한 파일명을 추가함
이미지 안의 파일 지정이 디렉토리(마지막 슬래시)일 때는 파일명은 URL로 지정한 것이 됨
호스트의 파일이 tar 아카이브거나 압축 포멧(gzip, bzip2 등)일 때는 디렉토리로 압축을 품

※원격 URL로 부터 다운로드한 리소스는 압축이 풀리지 않으므로 주의

빌드에 불필요한 파일 제외

Docker에서 빌드를 하면 빌드를 실행한 디렉토리 아래에 있는 모든 파일이 Docker 데몬으로 전송됨
빌드에서 제외 하고 싶은 파일이 있는 경우는 .dockerignore 라는 파일 안에 해당 파일명을 기술해야 함

제외 파일 지정

.dockerignore 파일에 dummyfile 추가

dummyfile

Dockerfile 작성

dummyfile을 이미지에 포함시키는 ADD 명령을 추가

# 베이스 이미지 지정
FROM ubuntu:latest

# 더미 파일 배치
ADD dummyfile /tmp/dummyfile

Dockerfile 빌드

docker build -t sample

로그를 확인하면 dummyfile이 존재 하지 않기 때문에 오류가 발생함
.dockerignore 파일을 설정 해두면 빌드에 불필요한 파일이 전송되지 않기 때문에 처리 속도가 빨라짐

파일 복사(COPY 명령)

이미지에 호스트상의 파일이나 디렉토리를 복사할 때는 COPY 명령을 사용

COPY 명령

COPY <호스트 파일 경로> <Docker 이미지의 파일 경로>
COPY ["<호스트의 파일 경로>" "<Docker 이미지의 파일 경로>"]

ADD 명령과 COPY 명령은 매우 비슷함
ADD 명령은 원격 파일의 다운로드나 아카이브의 압축 해제 등과 같은 기능을 갖고 있음
COPY 명령은 호스트상의 파일을 이미지 안으로 '복사하는' 처리만 함
단순히 이미지 안에 파일을 배치하기만 하고 싶을 때는 COPY 명령을 사용
COPY 명령의 구문은 ADD 명령과 똑같음

Dockerfile의 저장위치

Dockerfile로부터 이미지를 만들 때 docker build 명령은 Dockerfile을 포함하는 디렉토리(서브디렉토리 포함)를
모두 Docker 데몬으로 전송함

예를 들어 시스템의 루트 디렉토리를 Source Repository로 사용한 경우는 루트 디렉토리의 모든 컨텐츠를 Docker 데몬으로 전송하기 때문에 처리가 느려짐

Dockerfile의 저장 위치는 빈 디렉토리르 만들고 거기에 Dockerfile을 놓아두고 이미지를 작성하기를 권장함

Docker 빌드에 필요 없는 파일은 Dockerfile과 똑같은 디렉토리에 두지 않도록 주의 해야 함

볼륨 마운트(VOLUME 명령)

이미지에 볼륨을 할당하기위해 사용

VOLUME 명령

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

VOLUME 명령은 지정한 이름의 마운트 포인트를 작성하고, 호스트나 그 외 다른 컨테이너로 부터 볼륨의 외부 마운트를 수행함
설정할 수 있는 값은 VOLUME ["/var/log/"]와 같은 JSON 배열
또는 VOLUME /var/logVOLUME /var/log /var/db 와 같은 여러 개의 인수로된 문자열을 지정할 수 있음

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

728x90