「ディストリビューション」画像には、アプリケーションとそのランタイム依存関係のみが含まれています。パッケージマネージャー、シェル、または標準のLinuxディストリビューションで見つけると予想されるその他のプログラムは含まれていません。
詳細については、この講演(ビデオ)を参照してください。
2023年3月以降、 application/vnd.oci.image.manifest.v1+json
またはapplication/vnd.oci.image.index.v1+json
を参照するエラーが表示されている場合、配布画像はOCIマニフェストを使用します。最新のジブなど)。
ランタイムコンテナの内容をアプリに正確に制限することは、長年にわたって生産にコンテナを使用してきたGoogleや他のハイテク大手が採用しているベストプラクティスです。スキャナーのノイズ(CVEなど)への信号を改善し、必要なものだけに出所を確立する負担を軽減します。
ディストリビューション画像は非常に小さいです。最小の分配画像、 gcr.io/distroless/static-debian12
distroless/static-debian12は約2 mibです。これは、 alpine
のサイズの約50%(〜5 mib)であり、 debian
のサイズ(124 MIB)のサイズの2%未満です。
これらの画像はBazelを使用して構築されていますが、他のDocker画像ビルドツールを介して使用することもできます。
以下の画像は現在、ディストリビューションプロジェクトによって公開および更新されています(サポートのタイムラインについてはsupport_policyを参照)
画像 | タグ | アーキテクチャの接尾辞 |
---|---|---|
gcr.io/distroless/static-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、ARM、S390X、PPC64LE |
gcr.io/distroless/base-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、ARM、S390X、PPC64LE |
gcr.io/distroless/base-nossl-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、ARM、S390X、PPC64LE |
gcr.io/distroless/cc-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、ARM、S390X、PPC64LE |
gcr.io/distroless/python3-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64 |
gcr.io/distroless/java-base-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、S390X、PPC64LE |
gcr.io/distroless/java17-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、S390X、PPC64LE |
gcr.io/distroless/java21-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、PPC64LE |
gcr.io/distroless/nodejs18-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、ARM、S390X、PPC64LE |
gcr.io/distroless/nodejs20-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、ARM、S390X、PPC64LE |
gcr.io/distroless/nodejs22-debian12 | 最新のノンルート、デバッグ、デバッグノンルート | AMD64、ARM64、ARM、S390X、PPC64LE |
これらの画像には、すべてのサポートされているアーキテクチャを参照した画像インデックスを指します。アーキテクチャ固有の画像は、 gcr.io/distroless/static-debian12:latest-amd64
distroless/static-debian12:latest-amd64など、タグに追加のアーキテクチャサフィックスを使用して直接参照できます。
他のタグは非推奨と見なされ、更新されなくなりました
すべてのディストリビューション画像は、CoSignが象徴的なキー(キーレス)で署名します - これは2023年11月から唯一のサポートされているメカニズムです。画像を構築する前に使用するディストリビューション画像を確認することをお勧めします。次のような分配画像のキーレス署名を確認できます。
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
デフォルトではディストリビューション画像にはシェルが含まれていないことに注意してください。つまり、dockerfile ENTRYPOINT
コマンドは、定義された場合、シェルを使用したコンテナランタイムプレフィックスを避けるために、 vector
形式で指定する必要があります。
これは機能します:
ENTRYPOINT ["myapp"]
しかし、これは機能しません:
ENTRYPOINT "myapp"
同じ理由で、エントリポイントが空のベクトルに設定されている場合、CMDコマンドをvector
形式で指定する必要があります(以下の例を参照)。デフォルトでは、静的、ベース、CC画像には空のベクトルエントリポイントがあることに注意してください。言語ランタイムが含まれている画像には、言語固有のデフォルトがあります(Java、Nodejs、Python3を参照)。
Dockerマルチステージビルドは、ディストリビューション画像を簡単に使用します。これらの手順に従って開始します。
アプリケーションスタックの適切なベース画像を選択します。
マルチステージDockerファイルを書きます。注:これには、Docker 17.05以上が必要です。
基本的なアイデアは、アプリケーションアーティファクトを構築し、ランタイムディストリビューション画像に挿入するための1つの段階があるということです。詳細については、マルチステージビルドに関するドキュメントをご覧ください。
GOの簡単な例を次に示します。
# Start by building the application.
FROM golang:1.18 as build
WORKDIR /go/src/app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -o /go/bin/app
# Now copy it into our base image.
FROM gcr.io/distroless/static-debian12
COPY --from=build /go/bin/app /
CMD [ "/app" ]
ここで他の例を見つけることができます:
任意の例を実行するには、言語のディレクトリに移動して実行します
docker build -t myapp .
docker run -t myapp
node.jsを実行するには、アプリノードエクスプレッズをエクスプレスし、コンテナのポートを公開します。
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
これにより、ExpressアプリケーションがLocalHost:3000に公開されるはずです
Bazelを使用してコンテナ画像を生成する方法に関する完全なドキュメントについては、Bazel-Contrib/rules_ociリポジトリを参照してください。
GoベースのDebianパッケージマネージャー(現在)を使用してBazel構成を生成する方法に関するドキュメントと例については、ドキュメントについては./debian_package_managerを参照してください。 /package_manager
例は、このリポジトリの例のディレクトリにあります。
/Examplesディレクトリでいくつかの一般的なアプリケーションスタックを実行する方法については、いくつかの例があります。こちらをご覧ください:
画像にいくつかの一般的なタスクを完了する方法の例については、こちらをご覧ください。
これらの画像の構築とリリースの詳細については、こちらをご覧ください。
ディストリビューション画像は、Debian 12(BookWorm)に基づいています。画像は、Debianバージョンの接尾辞(例えば-debian12
)で明示的にタグ付けされています。分布なしで画像を指定すると、現在-debian12
画像が選択されますが、将来的にはDebianの新しいバージョンに変更されます。次のDebianバージョンがリリースされたときにビルドを破壊するのを防ぐために、分布を明示的に参照することが役立ちます。
Distlolessは、GitHubアクションを使用してアップストリームのデビアンリリースを追跡し、更新があるときにプル要求を自動的に生成します。
ディストリビューション画像は最小限であり、シェルアクセスがありません。 The :debug
イメージは、入力するBusyboxシェルを提供します。
例えば:
cd examples/python3/
Dockerfile
を編集して最終画像を変更します:debug
:
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]
次に、シェルエントリポイントでビルドして起動します。
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
注:既に使用している画像には、
gcr.io/distroless/java17-debian12:nonroot
java17-debian12:nonrootなどのタグがある場合、代わりにタグdebug-<existing tag>
を使用しますgcr.io/distroless/java17-debian12:debug-nonroot
。
注:LDDは、シェルスクリプトであるため、ベース画像にインストールされていません。コピーしたり、ダウンロードしたりできます。
プロジェクトがディストリビューションを使用している場合は、PRを送信してプロジェクトをここに追加してください!