docker compose build - ssh option (w/BuildKit)
--ssh
옵션은 파이톤이 봉인된 설치를 예로 들어 정리했다.컨디션
❯ 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
은 동작을 지원하지 않습니다.BuildKit 정보
BuildKit에 대한 상세한 설명은 잠시 접어두고, 본 편에 기재된 내용은 BuildKit의 imge build을 이용하는 것을 전제로 한다.
BuildKit은 Docker 18.09부터
DOCKER_BUILDKIT=1
환경 변수를 지정하여 사용할 수 있습니다.BuildKit에 관해서는 아래의 자료, 문서를 참고할 수 있다고 생각합니다.
docker
ssh 키 사용(w/BuildKit)
위에서 설명한 대로 Docker 18.09부터 BuildKit을 사용할 수 있습니다.
docker build이면
--ssh
옵션이 대응합니다. 다음 문서를 참고하여 Docker file을 기술할 수 있습니다.예를 들어 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 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
은 지원되지 않습니다.회피 정책으로
--ssh
option에서 포장 설치 단계를 지정하면 사전에 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에 대응할 수 있습니다.
Mac에서 사용하는 Docker Desktop의 경우 4.7.0의 docker compose 버전이 v2입니다.4.1.
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의 유효성은 다음 블로그를 참조하십시오.
docker compose 측
docker compose build
의 옵션은 기본적으로 --ssh
로만 지정됩니다.❯ 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
참조 링크
Reference
이 문제에 관하여(docker compose build - ssh option (w/BuildKit)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/taxin/articles/build-image-with-lib-in-private-repo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)