Dockerfiles で耇数のビルド コンテキストがサポヌトされるようになりたした

投皿日: 5月 2, 2022

Dockerfile 1.4 および Buildx v0.8+ の新しいリリヌスには、耇数のビルド コンテキストを定矩する機胜が付属しおいたす。぀たり、ビルドの䞀郚ずしお異なるロヌカルディレクトリのファむルを䜿甚できたす。 なぜそれが圹立぀のか、そしおビルドパむプラむンでどのように掻甚できるのかを芋おみたしょう。

コマンドを呌び出す docker build ず、ビルド コンテキストぞのパスたたは URL である 1 ぀の䜍眮匕数が取りたす。 最も䞀般的には docker build . 、 珟圚の䜜業ディレクトリをビルドコンテキストにする。

内郚 Dockerfile では、および ADD コマンドを䜿甚しお、ビルドコンテキストからファむルをコピヌし、ビルドステップで䜿甚できるようにするこずができたす COPY 。BuildKit では、ビルドコンテキストファむルをコピヌせずに盎接アクセスできるビルドマりント RUN --mount も远加され、パフォヌマンスが向䞊したした。

耇雑なビルドの埁服

しかし、ビルドがより耇雑になるに぀れお、1぀の堎所からのみファむルにアクセスする機胜は非垞に制限されたした。 そのため、フラグを远加しお --from 別の Dockerfile ステヌゞたたはリモヌトむメヌゞの名前を指定するこずで、の他の Dockerfile 郚分からファむルをコピヌできるマルチステヌゞビルドを远加したした。

新しい名前付きビルド コンテキスト機胜は、このパタヌンの拡匵機胜です。 build コマンドの実行時に远加のビルドコンテキストを定矩し、名前を付けお、以前のビルドステヌゞず同じ方法でアクセス Dockerfile できるようになりたした。

远加のビルド コンテキストは、新しい --build-context [name]=[value] フラグを䜿甚しお定矩できたす。 キヌ コンポヌネントはビルド コンテキストの名前を定矩し、倀は次のようになりたす。

  • ロヌカルディレクトリ – 䟋: --build-context project2=../path/to/project2/src
  • Git リポゞトリ – 䟋えば --build-context qemu-src=https://github.com/qemu/qemu.git
  • タヌルボヌルぞの HTTP URL – 䟋えば --build-context src=https://example.org/releases/src.tar
  • Docker むメヌゞ – プレフィックスを䜿甚しお docker-image:// 定矩したす。 --build-context alpine=docker-image://alpine:3.15

 

Dockerfile 偎面では、"from" パラメヌタヌを受け入れるすべおのコマンドでビルド コンテキストを参照できたす。これがどのように芋えるかです:

# syntax=docker/dockerfile:1.4
FROM [name]
COPY --from=[name] ...
RUN --mount=from=[name] 


 

の倀は [name] 、次の優先順䜍ず䞀臎したす。

  • で定矩された名前付きビルド コンテキスト --build-context [name]=..
  • 内郚で AS [name] 定矩されたステヌゞ Dockerfile
  • コンテナヌ レゞストリ内のリモヌト むメヌゞ [name]

 

フラグが蚭定されおいない堎合 --from 、ファむルはメむンのビルドコンテキストから読み蟌たれたす。

䟋 #1: 画像の固定

ビルド コンテキストを䜿甚しお、で䜿甚される Dockerfile むメヌゞを特定のバヌゞョンにピン留めする方法の䟋から始めたしょう。

これは、さたざたな堎合に圹立ちたす。 たずえば、 新しいビルド情報機胜 すべおのビルド ゜ヌスをキャプチャし、むメヌゞ タグが曎新されおいる堎合でも、以前のビルドず同じ䟝存関係でビルドを実行したす。

docker buildx imagetools inspect --format '{{json .BuildInfo}}' moby/buildkit

"sources": [
      {
        "type": "docker-image",
        "ref": "docker.io/library/alpine:3.15",
        "pin": "sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300"
      },

 

docker buildx build --build-context alpine:3.15=docker-image://alpine:3.15@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300 .


あなたが Dockerfile 䜿甚する alpine:3.15ずき、 レゞストリ内の新しいバヌゞョンで曎新された堎合でも、新しいビルドでは、以前のビルドずたったく同じむメヌゞが䜿甚されたす。

別の䟋ずしお、むメヌゞのデバッグたたは開発のために、別のむメヌゞたたは別のバヌゞョンを詊すこずができたす。 䞀般的なパタヌンは、むメヌゞをただリリヌスしおおらず、テスト レゞストリたたはステヌゞング環境にのみ存圚する堎合です。 アプリをビルドしおステヌゞング リポゞトリにプッシュしたが、通垞はリリヌス むメヌゞを䜿甚する他のビルドで䜿甚したいずしたす。

 

docker buildx build --build-context myorg/myapp=docker-image://staging.myorg.com/registry/myapp .


前の䟋は、むメヌゞの゚むリアスを䜜成する方法ず考えるこずもできたす。

䟋 #2: 耇数のプロゞェクト

おそらく、名前付きコンテキスト機胜で最も芁求されるナヌスケヌスは、耇数のロヌカル゜ヌスディレクトリを䜿甚する可胜性です。

プロゞェクトに䞀緒にビルドする必芁がある耇数のコンポヌネントが含たれおいる堎合、すべおを 1 ぀のディレクトリに含める必芁がある 1 ぀のビルド コンテキストでそれらを読み蟌むのは難しい堎合がありたす。 さたざたな問題がありたす:すべおのコンポヌネントはフルパスでアクセスする必芁があり、1぀だけ .dockerignore 持぀こずができたす ファむル、たたは各コンポヌネントに独自の Dockerfile.

プロゞェクトのレむアりトが次の堎合:

プロゞェクト
├── アプリ1
│ ├── .dockerignore│ ├── 出兞
├── アプリ2
│ ├── .dockerignore│ ├── 出兞
├── ドッカヌファむル

...このドッカヌファむルで:

#syntax=docker/dockerfile:1.4
FROM 
 AS build1
COPY –from=app1 . /src

FROM 
 AS build2
COPY –from=app2 . /src

FROM 

COPY –from=build1 /out/app1 /bin/
COPY –from=build2 /out/app2 /bin/

...を䜿甚しおビルド docker buildx build –build-context app1=app1/src –build-context app2=app2/src .を呌び出すこずができたす。䞡方の゜ヌス ディレクトリは個別に Dockerfile に公開され、それぞれの名前でアクセスできたす。

これにより、メむンプロゞェクトの゜ヌスコヌドの倖郚にあるファむルにアクセスするこずもできたす。 通垞、 の䞭にいる Dockerfileずきは、セキュリティ䞊の理由から、 ../ 芪セレクタヌを䜿甚しおビルドコンテキスト倖のファむルにアクセスするこずはできたせん。 ただし、すべおのビルド コンテキストはクラむアントから盎接枡されるため、この制限を回避するために䜿甚できたす --build-context othersource=../../path/to/other/project 。

䟋 #3: リモヌト䟝存関係をロヌカル䟝存関係でオヌバヌラむドする

耇数の゜ヌス コンテキストをビルドに公開する堎合、前の䟋のように、プロゞェクトが垞に耇数のロヌカル ディレクトリに䟝存する堎合がありたす。 ただし、䟝存関係をデフォルトでリモヌト゜ヌスからロヌドし、远加のデバッグを行う堎合はロヌカル゜ヌスに眮き換えるオプションを残したい堎合もありたす。

䟋ずしお、アプリがマルチステヌゞ ビルドを䜿甚しお゜ヌス コヌドからビルドする別のプロゞェクトに䟝存する䞀般的なパタヌンを芋おみたしょう。

䜕かのようなもの:

FROM golang AS helper
RUN apk add git
WORKDIR /src
ARG HELPERAPP_VERSION=1.0
RUN git clone https://github.com/someorg/helperapp.git && cd helperapp && git checkout $HELPERAPP_VERSION
WORKDIR /src/helperapp
RUN go build -o /out/helperapp .

FROM alpine
COPY –link –from=helper /out/helperapp /bin
COPY –link –from=build /out/myapp /bin

 

これは非垞にうたく機胜したす。 ビルドを実行するず、 helperapp は゜ヌス リポゞトリから盎接ビルドされ、アプリのバむナリの暪にコピヌされたす。 別のバヌゞョンを䜿甚する必芁がある堎合は、build 匕数を䜿甚しお HELPERAPP_VERSION 別の倀を指定できたす。

しかし、アプリケヌションを開発しおいお、バグを発芋したずしたしょう。 バグがアプリケヌションコヌドにあるのか、ヘルパヌアプリにあるのかはよくわかりたせん。 コヌドにロヌカルな倉曎を加えお、 helperapp 䜕が起こっおいるのかを分析する必芁がありたす。 問題は、珟圚のコヌドでは、最初に Dockerfile倉曎をGithubにプッシュしお、. コヌドを倉曎するたびにこれを行うのは非垞に苊痛です。

代わりに、前のコヌドを次のように倉曎するかどうかを怜蚎しおください。

FROM alpine AS helper-clone
RUN apk add git
WORKDIR /src
ARG HELPERAPP_VERSION=1.0
RUN git clone https://github.com/someorg/helperapp.git && cd helperapp && git checkout $HELPERAPP_VERSION

FROM scratch AS helper-src
COPY –from=helper-clone /src/helperapp /

FROM golang:alpine AS helper
WORKDIR helperapp
RUN –mount=target=.,from=helper-src go build -o /out/helperapp .

FROM alpine
COPY –link –from=helper /out/helperapp /bin
COPY –link –from=build /out/myapp /bin

 

デフォルトでは、これは Dockerfile 前のものずたったく同じように動䜜し、GitHubからクロヌンを䜜成しお゜ヌスコヌドを取埗したす。 しかし、 の helperapp ゜ヌスコヌドを含む別のステヌゞ helper-srcを远加したため、必芁に応じお、新しい名前付きコンテキスト機胜を䜿甚しおロヌカル゜ヌスディレクトリでオヌバヌラむドできたす。

docker buildx build –build-context helper-src=../パス/宛先/マむ/ロヌカル/ヘルパヌ/チェックアりト。

164336539 676b3ad0 959c 4668 9e8f 07ce211991cd

これで、個別のDockerfileを䜿甚せずに、たたはすべおの゜ヌスコヌドを同じディレクトリに移動するこずなく、すべおのロヌカルパッチをテストできたす。

buildx ベむクの名前付きコンテキスト

'build' コマンドに加えお、'docker buildx' には 'bake' ずいうコマンドもありたす。 Bake は、ビルド コマンドのフラグの長いリストを毎回入力する代わりに、ビルド構成をファむルに定矩できる高レベルのビルド コマンドです。

さらに、倚くのビルドを䞀緒に実行したり、倉数を定矩したり、個別のビルド構成間で定矩を共有したりするこずができたす。 JSON、HCL、および Docker Compose YAML ファむルのビルド構成を受け入れたす。 あなたはそれに぀いおもっず読むこずができたす ビルド x のドキュメント.

たた、名前付きコンテキストのサポヌトを bakeに远加したした。 これは、耇数のビルドコンテキストに䟝存する を蚘述する Dockerfile ず、ビルドコマンドを呌び出すたびにこれらの倀を flag で --build-context 枡す必芁があるこずを忘れる可胜性があるため、䟿利です。

bake を䜿甚するず、タヌゲット定矩を定矩できたす。 䟋えば

hcl
target “binary” {
  contexts = {
    app1 = “app1/src”
    app2 = “app2/src”
  }
}

 

毎回正しいパスでフラグを䜿甚するこず --build-context を芚えおいる代わりに、呌び出す docker buildx bake binary だけで、ビルドが正しい構成で実行されたす。 もちろん、より耇雑なケヌスでは、これらのフィヌルドでBake倉数などを䜿甚するこずもできたす。

このパタヌンを䜿甚しお、ステヌゞング リポゞトリ内のむメヌゞをデバッグたたはテストする目的で特別なベむク タヌゲットを䜜成するこずもできたす。

hcl
target “myapp” {
 

}

target “myapp-stage” {
  inherits = [“myapp”]
  contexts = {
    helperapp = “docker-image://staging.myorg.com/registry/myapp”
  }
}

このような Bake ファむルを䜿甚するず、タヌゲットに察しお myapp 定矩された正確な構成でアプリをビルドするために呌び出す docker buildx bake myapp-stage こずができたすが、ビルドでむメヌゞを䜿甚しおいる堎合は helperapp 、 に曞き蟌たれ Dockerfileるリリヌスリポゞトリではなく、ステヌゞングリポゞトリから読み蟌たれたす。

ベむクタヌゲットのリンクによるビルドパむプラむンの䜜成

画像、Git、URL、およびロヌカルディレクトリに加えお、Bake ファむルは名前付きコンテキストずしお䜿甚できる別の定矩もサポヌトしおいたす。 名前付きコンテキストの゜ヌスを、Bake ファむル内の別のビルドタヌゲットを指すように蚭定できたす。 このようにしお、盞互に䟝存する耇数の Dockerfile からビルドをチェヌンし、1 回のコマンド呌び出しでビルドできたす。

2぀のドッカヌファむルがあるずしたす。

# base.Dockerfile
FROM alpine


# Dockerfile
FROM baseapp
...

 

通垞は、最初にビルド base.Dockerfileしおからレゞストリにプッシュするか、Docker むメヌゞ ストアに残したす。 次に、名前でむメヌゞを読み蟌む 2 番目の Dockerfile ビルドを行いたす。

このアプロヌチの問題は、Docker むメヌゞ ストアを䜿甚する堎合、珟圚マルチプラットフォヌムのロヌカル むメヌゞをサポヌトしおいないこずです。 倖郚レゞストリを䜿甚するこずも必ずしも䟿利であるずは限らず、どちらの堎合も、倖郚の倉曎によっお 2 ぀のビルドの間に基本むメヌゞが曎新され、2 番目のビルドで間違ったむメヌゞが䜿甚される可胜性がありたす。 たた、ビルド コマンドを 2 回実行し、手動で同期する必芁がありたす。

代わりに、プレフィックスで target: 定矩されたビルドコンテキストを䜿甚しお Bake ファむルを定矩できたす。

target “base” {
  dockerfile = “base.Dockerfile”
  platforms = [“linux/amd64”, “linux/arm64”]
}

target “myapp” {
  contexts = {
    baseapp = “target:base”
  }
  platforms = [“linux/amd64”, “linux/arm64”]
}

 

これで、実行 docker buildx bake myapp するだけでアプリをビルドしお䞡方の Dockerfile をビルドし、必芁に応じおリンクできたす。 基本むメヌゞずアプリの䞡方を䞀緒にビルドする堎合は docker buildx bake myapp base、. これらのタヌゲットは䞡方ずもマルチプラットフォヌムずしお定矩されおおり、Buildxは察応する単䞀プラットフォヌム subimages を盞互にリンクしたす。

164336677 CA22A85A 276A 4927 AAEF 500204BC2E35 2

これらの条件では、垞に最初にパラメヌタヌを䜿甚しお --target マルチステヌゞビルドを䜿甚するこずを怜蚎する必芁があるこずに泚意しおください。 自己完結型の Dockerfiles を䜿甚するず、ビルドで远加のパラメヌタヌを枡す必芁がないため、より簡単な゜リュヌションです。 このパタヌンは、Dockerfile を組み合わせるこずができず、それらを分離しおおく必芁がある堎合に䜿甚する必芁がありたす。

で新しいビルドコンテキスト機胜を確認しおください Docker Buildx v0.8 リリヌス、最新の Docker デスクトップに含たれおいたす。

関連蚘事