docker compose build - ssh option (w/BuildKit)

23463 단어 Dockertech
docker compose v2.4.0부터 대응하는 --ssh 옵션은 파이톤이 봉인된 설치를 예로 들어 정리했다.

컨디션

  • Mac OS Monterey version 12.0.1
  • Docker for Mac 4.7.1 (Engine: 20.10.14)
  • ❯ docker version
    Client:
     Cloud integration: v1.0.23
     Version:           20.10.14
     API version:       1.41
     Go version:        go1.16.15
     Git commit:        a224086
     Built:             Thu Mar 24 01:49:20 2022
     OS/Arch:           darwin/arm64
     Context:           default
     Experimental:      true
    
    Server: Docker Desktop 4.7.1 (77678)
     Engine:
      Version:          20.10.14
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.16.15
      Git commit:       87a90dc
      Built:            Thu Mar 24 01:45:44 2022
      OS/Arch:          linux/arm64
      Experimental:     false
     containerd:
      Version:          1.5.11
      GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
     runc:
      Version:          1.0.3
      GitCommit:        v1.0.3-0-gf46b6ba
     docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
    

    하고 싶은 일


    GiitHub의 privte repository pip install에서 단독 포장을 하고 docker image의build을 하는 경우를 상상해 보세요.
    간단한 dockerbuild이면 --ssh 옵션은 대응하지만 로컬 개발 환경에서 docker-composedocker compose를 자주 사용합니다.
    v2.4.0 이전의 docker compose build 명령--ssh은 동작을 지원하지 않습니다.
    https://github.com/docker/compose/issues/7025

    BuildKit 정보


    BuildKit에 대한 상세한 설명은 잠시 접어두고, 본 편에 기재된 내용은 BuildKit의 imge build을 이용하는 것을 전제로 한다.
    BuildKit은 Docker 18.09부터 DOCKER_BUILDKIT=1 환경 변수를 지정하여 사용할 수 있습니다.
    BuildKit에 관해서는 아래의 자료, 문서를 참고할 수 있다고 생각합니다.
  • https://www.slideshare.net/AkihiroSuda/buildkit
  • https://docs.docker.com/develop/develop-images/build_enhancements/
  • docker


    ssh 키 사용(w/BuildKit)


    위에서 설명한 대로 Docker 18.09부터 BuildKit을 사용할 수 있습니다.
    docker build이면 --ssh 옵션이 대응합니다. 다음 문서를 참고하여 Docker file을 기술할 수 있습니다.
    https://docs.docker.com/develop/develop-images/build_enhancements/#using-ssh-to-access-private-data-in-builds
    예를 들어 Flash App을 시작하는 개발을 docker image로build로 만들고 싶습니다.requirements.txt 설치할 python 패키지를 관리하는 GiitHub repository를 지정합니다.
    requirements.txt
    ...
    sloppy @ git+ssh://[email protected]/taxintt/[email protected] ; python_version >= "3.9" and python_version < "4.0"
    uvicorn==0.17.6; python_version >= "3.7"
    
    위에서 설명한 대로 Docker file은 다음과 같습니다.--mount=type=ssh 지정을 통해 RUN에서 정의한 명령을 클라이언트 측의 ssh-agent로 사용합니다.ssh-add에서 ssh-agent에 대해 GiitHub에 사용되는 기밀 키에 미리 로그인해야 한다는 것을 주의해야 한다.)
    # syntax=docker/dockerfile:1
    ARG PYTHON_VER=3.9
    
    FROM python:${PYTHON_VER}-buster as app-base
    
    COPY requirements.txt .
    
    RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
    RUN --mount=type=ssh pip install --no-cache-dir -r requirements.txt
    
    RUN flask run --host=0.0.0.0 --port=5000 --debugger --reload
    
    준비가 되면 Docker file이 있는 디렉터리에서 이미지 build을 실행하기 위해 다음 명령을 실행할 수 있습니다.
    $ export DOCKER_BUILDKIT=1 
    $ docker image build -t pip-install-private-repo-sample .
    

    docker compose


    --ssh op 이전 workaround


    기록한 바와 같이, v2.4.0 이전 옵션docker compose은 지원되지 않습니다.
    회피 정책으로 --sshoption에서 포장 설치 단계를 지정하면 사전에 dockerbuild을 진행하는 것을 피할 수 있습니다.
    # 1. pkg (パッケージインストールを行うステージ) をtargetとして指定してimage buildを行う
    $ export DOCKER_BUILDKIT=1 
    $ docker image build --ssh default --target=pkg .
    
    # 2. docker compose buildを通す
    $ export COMPOSE_DOCKER_CLI_BUILD=1 
    $ export DOCKER_BUILDKIT=1 
    $ docker compose build
    

    --ssh option (^v2.4.0)


    상술한 회피 방법도 있지만, docker compose v2.4.0 릴리즈 후 docker compose build에서 -ssh option에 대응할 수 있습니다.
    https://github.com/docker/compose/releases/tag/v2.4.0
    Mac에서 사용하는 Docker Desktop의 경우 4.7.0의 docker compose 버전이 v2입니다.4.1.
    https://docs.docker.com/desktop/mac/release-notes/#docker-desktop-470
    Docker for Mac4.3.2(Engine:20..10.11) 상태에서 --target를 실행할 때 다음과 같이 pip install에 장애가 발생했습니다.
    => [libs 3/4] RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts                                                                                                                  6.6s
     => ERROR [libs 4/4] RUN --mount=type=ssh pip install --no-cache-dir -r requirements.txt                                                                                                                    2.1s
    ------                                                                                                                                                                                                           
     > [libs 4/4] RUN --mount=type=ssh pip install --no-cache-dir -r requirements.txt:                                                                                                                               
    #12 1.000 Ignoring colorama: markers 'python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or platform_system == "Windows" and python_version >= "3.7" and python_full_version >= "3.5.0"' don't match your environment
    #12 1.002 Collecting sloppy@ git+ssh://[email protected]/taxintt/[email protected]
    #12 1.002   Cloning ssh://****@github.com/taxintt/sloppy.git (to revision 0.1.0) to /tmp/pip-install-gd771hcn/sloppy_7e4edbf65fe949d795d03e7ff53cb5a3
    #12 1.014   Running command git clone --filter=blob:none --quiet 'ssh://****@github.com/taxintt/sloppy.git' /tmp/pip-install-gd771hcn/sloppy_7e4edbf65fe949d795d03e7ff53cb5a3
    #12 1.581   Warning: Permanently added the ECDSA host key for IP address '13.114.40.48' to the list of known hosts.
    #12 1.951   [email protected]: Permission denied (publickey).
    #12 1.955   fatal: Could not read from remote repository.
    #12 1.955 
    #12 1.955   Please make sure you have the correct access rights
    #12 1.970   and the repository exists.
    #12 1.975   error: subprocess-exited-with-error
    #12 1.975   
    #12 1.975   × git clone --filter=blob:none --quiet 'ssh://****@github.com/taxintt/sloppy.git' /tmp/pip-install-gd771hcn/sloppy_7e4edbf65fe949d795d03e7ff53cb5a3 did not run successfully.
    #12 1.975   │ exit code: 128
    #12 1.975   ╰─> See above for output.
    #12 1.975   
    #12 1.975   note: This error originates from a subprocess, and is likely not a problem with pip.
    #12 1.978 error: subprocess-exited-with-error
    #12 1.978 
    #12 1.978 × git clone --filter=blob:none --quiet 'ssh://****@github.com/taxintt/sloppy.git' /tmp/pip-install-gd771hcn/sloppy_7e4edbf65fe949d795d03e7ff53cb5a3 did not run successfully.
    #12 1.978 │ exit code: 128
    #12 1.978 ╰─> See above for output.
    #12 1.978 
    #12 1.978 note: This error originates from a subprocess, and is likely not a problem with pip.
    ------
    failed to solve: rpc error: code = Unknown desc = executor failed running [/bin/sh -c pip install --no-cache-dir -r requirements.txt]: exit code: 1
    make: *** [build-local] Error 17
    
    다른 한편, Docker for Mac4.7.1(Engine:20..10.14)에서 지정docker compose build된 동작--ssh을 수행할 수 있다.
    docker compose 명령에서 Buildkit의 유효성은 다음 블로그를 참조하십시오.
    https://www.docker.com/blog/faster-builds-in-compose-thanks-to-buildkit-support/
    docker compose 측docker compose build의 옵션은 기본적으로 --ssh로만 지정됩니다.
    https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.md#run---mounttypessh
    make build-local         
    env COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1        env UID=501 docker compose --project-directory=. --env-file=docker/local/compose.env build --ssh default --pull
    [+] Building 14.5s (13/13) FINISHED                                                                                                                                                                              
     => [internal] load build definition from Dockerfile                                                                                                                                                        0.0s
     => => transferring dockerfile: 32B                                                                                                                                                                         0.0s
     => [internal] load .dockerignore                                                                                                                                                                           0.0s
     => => transferring context: 2B                                                                                                                                                                             0.0s
     => resolve image config for docker.io/docker/dockerfile:1                                                                                                                                                  0.8s
     => CACHED docker-image://docker.io/docker/dockerfile:1@sha256:91f386bc3ae6cd5585fbd02f811e295b4a7020c23c7691d686830bf6233e91ad                                                                             0.0s
     => [internal] load build definition from Dockerfile                                                                                                                                                        0.0s
     => [internal] load .dockerignore                                                                                                                                                                           0.0s
     => [internal] load metadata for docker.io/library/python:3.9-buster                                                                                                                                        0.7s
     => [internal] load build context                                                                                                                                                                           0.0s
     => => transferring context: 38B                                                                                                                                                                            0.0s
     => [libs 1/4] FROM docker.io/library/python:3.9-buster@sha256:2ebfde37127af1b36196a6e4ca9b159e30b0fbea80b49cd1201ae48d907aeac4                                                                             0.0s
     => CACHED [libs 2/4] COPY requirements.txt .                                                                                                                                                               0.0s
     => CACHED [libs 3/4] RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts                                                                                                           0.0s
     => [libs 4/4] RUN --mount=type=ssh pip install --no-cache-dir -r requirements.txt                                                                                                                         12.6s
     => exporting to image                                                                                                                                                                                      0.1s
     => => exporting layers                                                                                                                                                                                     0.1s
     => => writing image sha256:feab17f4b00d2933673893742a0614cb431532148b89599722d5629577d45c04                                                                                                                0.0s 
     => => naming to docker.io/library/use_sloppy_app                                                                                                                                                           0.0s
    
    Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
    
    일련의 실행 명령에서 Buildkit의 유효성 및 --ssh default 옵션만 지정합니다.
    위 로그에서는 유효성 검사 환경에 따라 Makefile을 사용하기 때문에 다음 명령과 일치하지 않습니다.
    $ export COMPOSE_DOCKER_CLI_BUILD=1 
    $ export DOCKER_BUILDKIT=1 
    $ docker compose build --ssh default
    

    참조 링크

  • https://docs.docker.com/develop/develop-images/build_enhancements/#using-ssh-to-access-private-data-in-builds
  • https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.md#run---mounttypessh
  • https://www.docker.com/blog/faster-builds-in-compose-thanks-to-buildkit-support/
  • 좋은 웹페이지 즐겨찾기