[Docker] Dockerfile 환경 및 설정
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/log
나 VOLUME /var/log /var/db
와 같은 여러 개의 인수로된 문자열을 지정할 수 있음
컨테이너는 영구 데이터를 저장하는 데는 적합하지 않음
영구 저장이 필요한 데이터는 컨테이너 밖의 스토리지에 저장하는 것이 좋음
영구 데이터는 Docker의 호스트 머신상의 볼륨에 마운트하거나 공유 스토리지를 볼륨으로 마운트 하는 것이 가능함