Docker 모범 사례: 이미지
5136 단어 imagesdockerfiledocker
빌드 컨텍스트 이해
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
Reference
이 문제에 관하여(Docker 모범 사례: 이미지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/grigorkh/docker-best-practices-images-558
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
기본적으로 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
Reference
이 문제에 관하여(Docker 모범 사례: 이미지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/grigorkh/docker-best-practices-images-558
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
COPY <filename>.zip <copy_directory>
RUN unzip <filename>.zip
RUN rm <filename>.zip
RUN curl <file_download_url> -O <copy_directory> \
&& unzip <copy_directory>/<filename>.zip -d <copy_directory> \
&& rm <copy_directory>/<filename>.zip
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
Reference
이 문제에 관하여(Docker 모범 사례: 이미지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/grigorkh/docker-best-practices-images-558
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
이미지를 생성할 때 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
Reference
이 문제에 관하여(Docker 모범 사례: 이미지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/grigorkh/docker-best-practices-images-558
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
로그 회전을 허용하려면
--log-opt
를 사용하십시오. 이렇게 하면 생성 중인 컨테이너가 너무 장황하고 지속적인 배포 프로세스로 인해 너무 자주 생성되는 경우에 도움이 됩니다. 자세한 내용은 the log driver options을 참조하십시오.원래 여기에 게시됨: https://medium.com/devgorilla/docker-best-practices-images-98e9464cc173
Reference
이 문제에 관하여(Docker 모범 사례: 이미지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/grigorkh/docker-best-practices-images-558텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)