Docker "RUN-mount = type = cache, target"에 대한 이야기

17942 단어 Docker

개요


docker build 캐시를 사용할 때의 글
글에는 RUN-mount = type = secret, RUN-mount = type = ssh가 언급되지 않았습니다.

환경 확인


docker for mac을 사용하고 있습니다.
$ uname -a
Darwin mbp01 19.0.0 Darwin Kernel Version 19.0.0: Thu Oct 17 16:17:15 PDT 2019; root:xnu-6153.41.3~29/RELEASE_X86_64 x86_64

$ docker version
Client: Docker Engine - Community
 Version:           19.03.4
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        9013bf5
 Built:             Thu Oct 17 23:44:48 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.4
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       9013bf5
  Built:            Thu Oct 17 23:50:38 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

확인


(매크로 패키지 관리자 캐시 설정)
예를 들어 이런 Docker file이 있습니다.
(dnf를 사용하여 포장을 적당히 설치하면 된다)
FROM centos:8
RUN echo "test1"
RUN dnf install -y \
    gcc gcr lvm2 clang
buildkit을 사용한 상태에서 이것을 구축해 보십시오
그래서 손 옆에 있는 환경에서 약 50초 만에 구축을 마쳤다.
docker image build -t test01 .
[+] Building 49.4s (7/7) FINISHED
 => [internal] load .dockerignore                                                                                                 0.0s
 => => transferring context: 2B                                                                                                   0.0s
 => [internal] load build definition from Dockerfile                                                                              0.0s
 => => transferring dockerfile: 114B                                                                                              0.0s
 => [internal] load metadata for docker.io/library/centos:8                                                                       2.1s
 => [1/3] FROM docker.io/library/centos:8@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9                 0.0s
 => CACHED [2/3] RUN echo "test1"                                                                                                 0.0s
 => [3/3] RUN dnf install -y  gcc gcr lvm2 clang                                                                                 44.1s
 => exporting to image                                                                                                            3.2s
 => => exporting layers                                                                                                           3.2s
 => => writing image sha256:d122ae7f88c40310b925ca575df754f3732a18fb26a488ba11c8de7bf174d1e4                                      0.0s
 => => naming to docker.io/library/test01                                                                                         0.0s
>>> elapsed time 50s
그리고 app 이전에 층을 새로 만들기 위해 아래와 같이 dockerfile을 수정합니다.
FROM centos:8
RUN echo "test2" # 修正
RUN dnf install -y \
    gcc gcr lvm2 clang
그리고 같은 지령으로 구축하려면 시간이 많이 걸리지 않는다.
(이미지 레이어에 대해서는 다음을 참조하십시오.)
모르면 손해라는 Docker 인상층 구조
$ docker image build -t test02 .
[+] Building 52.6s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                              0.0s
 => => transferring dockerfile: 114B                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                 0.0s
 => => transferring context: 2B                                                                                                   0.0s
 => [internal] load metadata for docker.io/library/centos:8                                                                       3.0s
 => CACHED [1/3] FROM docker.io/library/centos:8@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9          0.0s
 => [2/3] RUN echo "test2"                                                                                                        0.7s
 => [3/3] RUN dnf install -y  gcc gcr lvm2 clang                                                                                 45.7s
 => exporting to image                                                                                                            3.0s
 => => exporting layers                                                                                                           3.0s
 => => writing image sha256:85b29e834097a17f7311c775bed1b1a0604ddacc6af81a19267edff0ab4ae7cf                                      0.0s
 => => naming to docker.io/library/test02                                                                                         0.0s
>>> elapsed time 52s
가장 시간이 걸리는 것은 당신이 알고 있는 gcc의 설치입니다.
gcc의 설치는 의존하는 소프트웨어 패키지가 많기 때문에 시간이 오래 걸린다.
nf(yum)는 매우 똑똑하다.자신의 캐시를 가지고 그곳을 효과적으로 이용하면 신속하게 구축할 수 있다는 느낌이 든다.
이때 유용한 것은 바로'--mount=type=cache, target'이다.

옵션


Option
Description
id
고유 ID 지정
target(필수)
마운트 경로 지정
ro,readonly
읽기 전용 옵션
sharing
공유할 때의 방식(자세한 내용은 아래 페이지를 참조하세요.🙇‍♂️)
from
캐시 기반이 되는 디렉토리
  • Dockerfile frontend experimental syntaxes
  • 이것을 사용하면 이전 Docker file의 두 번째 줄에서 진행된 echo의 캐시를 망가뜨립니다
    패키지 관리자의 캐시를 이용하여 구축할 수 있습니다.
    예를 들어 Docker file입니다.
    아직 비표준 명령이므로 첫 번째 행에는 "#syntax = docker/dockerfile:experimental"에 대한 설명이 필요합니다.
    "--mount=type = cache, target"대상의 디렉터리를 부드럽게 저장하려면 (app 등이라면 적당히 다시 읽으십시오)
    # syntax = docker/dockerfile:experimental
    FROM centos:8
    RUN echo "test3"
    RUN \
      --mount=type=cache,target=/var/cache/dnf \
      --mount=type=cache,target=/var/lib/dnf \
      dnf install -y \
        gcc gcr lvm2 clang
    

    첫 번째 구축


    첫 번째는 현금 구축이다.위와 마찬가지로 50초 정도 걸립니다.
    $ docker image build -t test03 .
    [+] Building 52.3s (9/9) FINISHED
     => [internal] load .dockerignore                                                                                                 0.0s
     => => transferring context: 2B                                                                                                   0.0s
     => [internal] load build definition from Dockerfile                                                                              0.0s
     => => transferring dockerfile: 250B                                                                                              0.0s
     => resolve image config for docker.io/docker/dockerfile:experimental                                                             2.1s
     => CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:888f21826273409b5ef5ff9ceb90c64a8f8ec7760da30d1ffbe6c3  0.0s
     => [internal] load metadata for docker.io/library/centos:8                                                                       0.9s
     => CACHED [stage-0 1/3] FROM docker.io/library/centos:8@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9  0.0s
     => [stage-0 2/3] RUN echo "test3"                                                                                                0.7s
     => [stage-0 3/3] RUN   --mount=type=cache,target=/var/cache/dnf   --mount=type=cache,target=/var/lib/dnf   dnf install -y  gcc  44.8s
     => exporting to image                                                                                                            3.1s
     => => exporting layers                                                                                                           3.1s
     => => writing image sha256:a4f1634b51036b0ae3107ac44884e980701a698c44315786c9eb42450f65ce51                                      0.0s
     => => naming to docker.io/library/test03
    

    2차 구축


    캐시를 사용하지 않는 검증과 같이 echo의 부분을 다시 씁니다.
    # syntax = docker/dockerfile:experimental
    FROM centos:8
    RUN echo "test4" #修正
    RUN \
      --mount=type=cache,target=/var/cache/dnf \
      --mount=type=cache,target=/var/lib/dnf \
      dnf install -y \
        gcc gcr lvm2 clang
    
    위의 구문을 사용합니다.
    결과는 약 20초 단축됐다.
    docker image build -t test04 .
    [+] Building 35.7s (9/9) FINISHED
     => [internal] load build definition from Dockerfile                                                                              0.0s
     => => transferring dockerfile: 250B                                                                                              0.0s
     => [internal] load .dockerignore                                                                                                 0.0s
     => => transferring context: 2B                                                                                                   0.0s
     => resolve image config for docker.io/docker/dockerfile:experimental                                                             0.9s
     => CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:888f21826273409b5ef5ff9ceb90c64a8f8ec7760da30d1ffbe6c3  0.0s
     => [internal] load metadata for docker.io/library/centos:8                                                                       0.9s
     => CACHED [stage-0 1/3] FROM docker.io/library/centos:8@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9  0.0s
     => [stage-0 2/3] RUN echo "test4"                                                                                                0.7s
     => [stage-0 3/3] RUN   --mount=type=cache,target=/var/cache/dnf   --mount=type=cache,target=/var/lib/dnf   dnf install -y  gcc  29.5s
     => exporting to image                                                                                                            2.9s
     => => exporting layers                                                                                                           2.9s
     => => writing image sha256:602d0e7bcc5b5701276bc0d25c853557d45b6925cb049cd4848b739647992ba0                                      0.0s
     => => naming to docker.io/library/test04                                                                                         0.0s
    >>> elapsed time 35s
    
    "[stage-03/3] RUN-mount = type = cache, target=/var/cache/dnf"섹션에 주목해야 합니다.
    처음엔 44초가량 걸렸고 상대로는 30초가량 걸렸다.

    총결산


    이번에 dnf에서 해봤는데 pip와 포장 관리가 텍스트로 된 포장 관리자 등도 효과가 있어요.
    (requirements.txt를 빈번하게 다시 쓰는 경우도 어느 정도 캐시 효과가 있나요?)
    가방의 갱신과 현금이 효과적인 부분(다무대빌딩의 보도가 많다)의 개선이 기쁘다.
    나는 앞으로 시도하면서 놀고 싶다.

    사이트 축소판 그림

  • Docker 18.09 새 기능 (이미지 구축 & 보안)
  • Best practices for writing Docker files(영어)
  • Docker file의 모범 사례 해설편 작성
  • Docker file 개선을 위한 Best Proactice 2019년 버전
  • 좋은 웹페이지 즐겨찾기