Docker 모범 사례: 이미지

빌드 컨텍스트 이해



docker build 명령을 실행하면 현재 작업 디렉터리를 빌드 컨텍스트라고 합니다. 소스 리포지토리를 재구성하지 않고 빌드와 관련이 없는 파일을 제외하려면 .dockerignore 파일을 사용합니다. 이 파일은 .gitignore 파일과 유사한 제외 패턴을 지원합니다. 생성에 대한 정보는 .dockerignore 파일을 참조하십시오.

루트가 아닌 사용자



기본적으로 Docker는 컨테이너 내부가 보안 문제로 제기될 수 있는 루트로 컨테이너를 실행합니다. 가능하면 권한이 없는 사용자로 컨테이너를 실행하고 싶을 것입니다.

레이어 수 최소화



Dockerfile에 생성될 레이어 수를 줄이십시오. RUN, COPY, ADD 명령어는 레이어를 생성합니다. 다른 지침은 임시 중간 이미지를 만들고 빌드 크기를 직접 늘리지 않습니다.

예시 :



zip 파일을 가져와 압축을 풀고 zip 파일을 제거해야 한다고 가정합니다. 두 가지 가능한 방법이 있습니다.

COPY <filename>.zip <copy_directory>
RUN unzip <filename>.zip
RUN rm <filename>.zip


또는 하나의 RUN 블록에서:

RUN curl <file_download_url> -O <copy_directory> \
&& unzip <copy_directory>/<filename>.zip -d <copy_directory> \
&& rm <copy_directory>/<filename>.zip


첫 번째 방법은 3개의 레이어를 만들고 이미지에 원하지 않는 .zip을 포함하여 이미지 크기도 증가시킵니다. 그러나 두 번째 방법은 하나의 레이어만 생성하기 때문에 레이어 수를 최소화하는 것이 최우선이라면 최적의 방법으로 선호된다. 그러나 명령 중 하나를 변경하면 모든 명령이 다시 실행된다는 단점이 있습니다. 이는 docker build 캐시 메커니즘이 피하는 것입니다. 상황에 가장 적합한 전략을 선택하십시오.

자세한 내용은 Best practices for writing Dockerfiles을 참조하십시오.

그러나 때때로 하나의 RUN 블록에서 모든 명령을 실행하면 특히 &&|| 문을 혼합하여 일치시키려고 할 때 스크립트가 더 불투명해질 수 있습니다. 대체 구문은 일반적으로 하는 것처럼 줄 연속을 사용하지만 명시적으로 셸의 "오류 발생 시 종료"모드로 전환하는 것입니다.

RUN set -e ;\
    echo 'successful!' ;\
    echo 'but the next line will exit: ' ;\
    false ;\
    causing this line not to run

# now you can use traditional shell flow of control without worry:
RUN set -e ;\
    echo 'next line will take evasive action' ;\
    if false; then \
      echo 'it seems that was false' >&2 ;\
    fi ;\
    echo 'and the script continues'


다단계 빌드 사용



다단계 빌드에서는 Dockerfile에서 여러FROM 문을 사용합니다. 각FROM 명령은 서로 다른 기반을 사용할 수 있으며 각 명령은 빌드의 새 단계를 시작합니다. 한 단계에서 다른 단계로 아티팩트를 선택적으로 복사하고 최종 이미지에 원하지 않는 모든 것을 남겨둘 수 있습니다. 이것이 어떻게 작동하는지 보여주기 위해 Dockerfile을 살펴보겠습니다.

FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]  


레이어 크기 최소화



일부 설치는 필요하지 않은 데이터를 생성합니다. 레이어 내에서 이 불필요한 데이터를 제거해 보십시오.

RUN yum install -y epel-release && \
    rpmkeys --import file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 && \
    yum install -y --setopt=tsflags=nodocs bind-utils gettext iproute\
    v8314 mongodb24-mongodb mongodb24 && \
    yum -y clean all


CMD에서 npm 및 pm2를 피하십시오.



이미지를 생성할 때 package.json의 시작 명령을 무시하고 이미지 자체에 직접 베이킹할 수 있습니다. 먼저 컨테이너 내부에서 실행되는 프로세스 수가 줄어듭니다. 두 번째로 SIGTERM 및 SIGINT와 같은 종료 신호를 npm이 삼키는 대신 Node.js 프로세스에서 수신하도록 합니다.

CMD ["node","index.js"]


RUN 전용 환경 변수RUN 블록 중에 환경 변수 설정이 필요하지만 불필요하거나 잠재적으로 다운스트림 이미지에 방해가 되는 경우 RUN를 사용하여 전역적으로 선언하는 대신 ENV 블록에서 변수를 설정할 수 있습니다. 이미지:

RUN export DEBIAN_FRONTEND=noninteractive ;\
    apt-get update ;\
    echo and so forth


태깅



태그를 사용하여 이미지의 특정 버전을 참조하십시오.

태그는 특정 Docker 컨테이너 이미지를 나타내는 데 사용할 수 있습니다. 따라서 태깅 전략에는 올바른 이미지를 식별하는 데 도움이 되는 CI 서버(예: Jenkins)의 고유 카운터build id가 포함되어야 합니다.

자세한 내용은 The tag command을 참조하십시오.

로그 회전



로그 회전을 허용하려면 --log-opt를 사용하십시오. 이렇게 하면 생성 중인 컨테이너가 너무 장황하고 지속적인 배포 프로세스로 인해 너무 자주 생성되는 경우에 도움이 됩니다. 자세한 내용은 the log driver options을 참조하십시오.



원래 여기에 게시됨: https://medium.com/devgorilla/docker-best-practices-images-98e9464cc173

좋은 웹페이지 즐겨찾기