dockerhub의 automated build에서 임의의 docker build 명령을 사용하여 단일 Dockerfile에서 설정을 동적으로 변경하여 여러 이미지를 빌드합니다.

개요



dockerhub에는 automated build라는 기능이 있습니다.Dockerfile 를 포함한 github 리포지토리를 연결하면 dockerhub 빌드 서버에서 CI로 자동으로 이미지를 빌드합니다.

이 repository에 hooks/build 파일을 두면 빌드를 임의의 명령으로 재정의할 수 있습니다.
또, 그 때에 여러가지 환경 변수를 참조할 수 있으므로, 그것을 --build-arg 에 걸치는 것으로, 생성하는 이미지에 동적으로 파라미터를 설정할 수 있습니다.

빌드 후크 정보


hooks/build 를 작성해 두면, automated build시에 훅 해 빌드의 거동을 오버라이드(override) 할 수 있습니다.

hooks/build
#!/bin/bash
set -eu

docker build -t $IMAGE_NAME .

(↑이 hooks/build 의 예라면 디폴트 거동과 특별히 차이는 없습니다만)

이 기능에 대해 Docker Cloud 문서에는 설명이 있습니다 ( htps : // / cs. 도 c r. 코 m / 도 c 케 r-c ぉ d / 부이 lds / 아 d ).
Docker Hub에 대한 문서를 찾을 수 없었지만 비슷한 방식으로 작동하는 것 같습니다.
하지만 일부 환경 변수가 Docker Cloud 문서와 일치하지 않는 것 같습니다.
(또한, 이 문서에 의하면, hooks/build 이외에도 훅 포인트가 있는 것 같습니다 (시험하고 있지 않습니다))

빌드 후크에서 참조할 수 있는 환경 변수


hooks/buildenv 명령을 넣어 어떤 환경 변수가 설정되는지 보았습니다.
Github repo는 htps : // 기주 b. 코 m / 츠치에 에에 / 도 c 케 r 쿠다 py 3 3 , exper/echo-env 라는 브랜치에 add env to hooks/build
다양한 환경 변수를 얻을 수 있음을 알 수 있습니다.
HOSTNAME=287ed2d96aaa

DOCKER_REPO=index.docker.io/tuttieee/cuda-python3

DOCKER_HOST=unix:///var/run/docker.sock

SOURCE_BRANCH=exper/echo-env

PYTHONUNBUFFERED=1

PUSH=true

GIT_SHA1=3c8f459ac08b2c4c5a7e3fbf74d9f8b44d2cf621

BUILD_PATH=/

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

SIGNED_URLS={"post": {"debug": {"url": "https://docker-highland-p1-debug-logs.s3.amazonaws.com/", "fields": {"policy": "eyJjb25kaXRpb25zIjogW1siY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCA2NzEwODg2NF0sIHsiYnVja2V0IjogImRvY2tlci1oaWdobGFuZC1wMS1kZWJ1Zy1sb2dzIn0sIHsia2V5IjogImI5dnFxaXRwdmdoa2NwZHc3eGp2OXdtLmxvZyJ9XSwgImV4cGlyYXRpb24iOiAiMjAxOC0wOS0xOVQxNjoxNjowOVoifQ==", "AWSAccessKeyId": "AKIAIA35NOZ7FSTHT73Q", "key": "b9vqqitpvghkcpdw7xjv9wm.log", "signature": "6oUI+zAq8ZUDnepttUsvySwYIUU="}}, "metrics": {"url": "https://docker-highland-p1-metrics-logs.s3.amazonaws.com/", "fields": {"policy": "eyJjb25kaXRpb25zIjogW1siY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCA2NzEwODg2NF0sIHsiYnVja2V0IjogImRvY2tlci1oaWdobGFuZC1wMS1tZXRyaWNzLWxvZ3MifSwgeyJrZXkiOiAiYjl2cXFpdHB2Z2hrY3Bkdzd4anY5d20ubG9nIn1dLCAiZXhwaXJhdGlvbiI6ICIyMDE4LTA5LTE5VDE2OjE2OjA5WiJ9", "AWSAccessKeyId": "AKIAIA35NOZ7FSTHT73Q", "key": "b9vqqitpvghkcpdw7xjv9wm.log", "signature": "z2wmXnjeua6ahyvuf1ZJSPzK9kg="}}, "readme": {"url": "https://docker-highland-p1-readmes.s3.amazonaws.com/", "fields": {"policy": "eyJjb25kaXRpb25zIjogW1siY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCA2NzEwODg2NF0sIHsiYnVja2V0IjogImRvY2tlci1oaWdobGFuZC1wMS1yZWFkbWVzIn0sIHsia2V5IjogImI5dnFxaXRwdmdoa2NwZHc3eGp2OXdtLm1kIn1dLCAiZXhwaXJhdGlvbiI6ICIyMDE4LTA5LTE5VDE2OjE2OjA5WiJ9", "AWSAccessKeyId": "AKIAIA35NOZ7FSTHT73Q", "key": "b9vqqitpvghkcpdw7xjv9wm.md", "signature": "xdomB7XZmq1DZ8x58BbirJZEMAc="}}, "dockerfile": {"url": "https://docker-highland-p1-dockerfiles.s3.amazonaws.com/", "fields": {"policy": "eyJjb25kaXRpb25zIjogW1siY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCA2NzEwODg2NF0sIHsiYnVja2V0IjogImRvY2tlci1oaWdobGFuZC1wMS1kb2NrZXJmaWxlcyJ9LCB7ImtleSI6ICJiOXZxcWl0cHZnaGtjcGR3N3hqdjl3bS5Eb2NrZXJmaWxlIn1dLCAiZXhwaXJhdGlvbiI6ICIyMDE4LTA5LTE5VDE2OjE2OjA5WiJ9", "AWSAccessKeyId": "AKIAIA35NOZ7FSTHT73Q", "key": "b9vqqitpvghkcpdw7xjv9wm.Dockerfile", "signature": "hHB0CYrXcOxmcQwba6f2FP7A66A="}}, "logs": {"url": "https://s3.amazonaws.com/docker-highland-p1-build_logs", "fields": {"policy": "eyJjb25kaXRpb25zIjogW1siY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCA2NzEwODg2NF0sIHsiYnVja2V0IjogImRvY2tlci1oaWdobGFuZC1wMS1idWlsZF9sb2dzIn0sIHsia2V5IjogImI5dnFxaXRwdmdoa2NwZHc3eGp2OXdtLmxvZyJ9XSwgImV4cGlyYXRpb24iOiAiMjAxOC0wOS0xOVQxNjoxNjowOVoifQ==", "AWSAccessKeyId": "AKIAIA35NOZ7FSTHT73Q", "key": "b9vqqitpvghkcpdw7xjv9wm.log", "signature": "lkuVdZEd4UOX2wUNZKIy02v6R6M="}}}, "get": {}}

DOCKER_TAG=exper_echo-env

GIT_MSG=add env to hooks/build



COMMIT_MSG=add env to hooks/build



PWD=/src/b9vqqitpvghkcpdw7xjv9wm

BUILD_CODE=b9vqqitpvghkcpdw7xjv9wm

IMAGE_NAME=index.docker.io/tuttieee/cuda-python3:exper_echo-env

HOME=/root

SHLVL=1

DOCKERCFG={"https://index.docker.io/v1/": {"email": "[email protected]", "auth": "dHV0dGllZWU6ZTc4ODRjMWYtNWUyOS00MmFhLThhNmItMjBiOGYzNTNjZjkx"}}

DOCKERFILE_PATH=

DEBIAN_FRONTEND=noninteractive

CACHE_TAG=

SOURCE_TYPE=git

MAX_LOG_SIZE=67108864



이상의 구조를 실제로 이용해 보았습니다.

여기서는 nvidia/cuda를 기본 이미지로 사용하여 python3을 설치 한 Docker 이미지 만 만들었습니다.
htps : // 기주 b. 코 m / 츠치에 에에 / 도 c 케 r 쿠다 py 3 3
nvidia/cuda 는, tag에 의해 다양한 바리에이션의 이미지를 구분할 수 있습니다 ( htps : // 후 b. 도 c r. 코 m/r/응ぃぢ아/쿠다/ ).
여기에서는 각 tag를 베이스로 빌드한 각종의 이미지를 만들고 싶습니다( nvidia/cuda:9.2-runtime-ubuntu16.04 를 베이스로 tuttieee/cuda-python3:9.2-runtime-ubuntu16.04 를 빌드, nvidia/cuda:9.1-base-ubuntu17.04 를 베이스로 tuttieee/cuda-python3:9.1-base-ubuntu17.04 를 빌드,……와 같이).

베이스 이미지의 tag마다 별도의 Dockerfile을 만들어 관리하는 것은 힘들므로 피하고 싶습니다.

그래서 FROM (베이스 이미지)를 ARG 로 동적으로 변경할 수 있도록 한 Dockerfile 를 하나만 만들고 빌드시에 동적으로 설정하도록 합니다.
※ Docker 17.05에서 ARG 로 설정한 변수를 FROM 로 참조할 수 있게 되어 있습니다.

Dockerfile
ARG BASE_TAG
FROM nvidia/cuda:${BASE_TAG}

# Python3のインストールなど
# ...
# ...

그런 다음 hooks/build 를 준비하고 환경 변수를 기반으로 --build-arg 를 설정합니다.

hooks/build
#!/bin/bash
set -eu

if [ "$DOCKERFILE_PATH" = "" ]; then
    DOCKERFILE_PATH_ARG=""
else
    DOCKERFILE_PATH_ARG="-f $DOCKERFILE_PATH"
fi

docker build --build-arg BASE_TAG=${DOCKER_TAG} ${DOCKERFILE_PATH_ARG} -t $IMAGE_NAME .

이상을 Github에 push하고 repo와 연관된 automated build를 작성합니다.
이 예에서는 htps //w w. ㄹㄹㄴㄴㄴㄴ g. 코 m / b ぉ g / 2017 / 우세 - rg - c r r ぃぇ - dy nami c eumge - s ぺし ふぃ 카치 온 입니다.
그런 다음 Build Settings를 다음과 같이 설정합니다.
htps : // 후 b. 도 c r. 코 m / r / 츠치 에에 / 쿠다 py 텐 3 /

예를 들어 Docker Tag Name = 9.2-runtime-ubuntu16.04 의 설정에서는 tuttieee/cuda-python3:9.2-runtime-ubuntu16.04 가 빌드됩니다.
이 때에 hooks/buildDockerfile 의 ARG 의 설정에 의해, 베이스 이미지로서 nvidia/cuda:9.2-runtime-ubuntu16.04 가 사용됩니다.

이 톤으로 각 Tag를 설정해 가면, nvidia/cuda 의 각 Tag를 베이스로 한, 복수의 오리지날의 Docker 이미지가 자동으로 빌드 되게 됩니다.

좋은 웹페이지 즐겨찾기