Github: https://github.com/GoogleContainerTools/distroless
「無差別」ドッカー画像
「無意味な」イメージには、アプリケーションとランタイム依存性だけが含まれます。 標準のLinuxディストリビューションで見つかるはずのパッケージマネージャ、シェル、その他のプログラムは含まれていません。
なぜ無秩序な画像を使うべきですか?
ランタイムコンテナの内容をアプリケーションに必要なものに正確に制限することは、長年にわたり本番環境でコンテナを使用してきたGoogleやその他の技術巨人が採用したベストプラクティスです。 スキャナ(CVEなど)の信号対雑音比を改善し、必要なものだけを提供する負担を軽減します。
無秩序な画像を使用するにはどうすればいいですか?
これらの画像は、 bazelツールを使用して作成されますが、他のDocker画像作成ツールでも使用できます。
ドッカー
ドッカーのマルチステージビルドは、無秩序な画像を簡単に使用します。 開始するには、次の手順を実行します。
-
アプリケーションスタックに適したベースイメージを
gcr.io
以下の無差別ベースイメージを公開します: -
多段ドッカーファイルを作成します。 注意:これにはDocker 17.05以上が必要です。
基本的な考え方は、アプリケーション成果物を構築し、ランタイムの無人のイメージにそれらを挿入する段階が1つあることです。 詳細は、 マルチステージビルドのドキュメントを参照してください。
ドッカーの例
goの簡単な例は次のとおりです。
# Start by building the application.
FROM golang:1.8 as build
WORKDIR /go/src/app
COPY . .
RUN go-wrapper download # "go get -d -v ./..."
RUN go-wrapper install
# Now copy it into our base image.
FROM gcr.io/distroless/base
COPY --from=build /go/bin/app /
CMD ["/app"]
他の例をここで見つけることができます:
例を実行するには、言語のディレクトリに移動して実行します
docker build -t myapp .
docker run -t myapp
バゼル
bazelを使用してDockerイメージを生成する方法については、 bazelbuild / rules_dockerリポジトリを参照してください。
bazelパッケージマネージャールールの使用方法に関するドキュメントと例については、./package_managerを参照してください。
このリポジトリのexamplesディレクトリに例があります。
Bazelの例
/ examplesディレクトリにいくつかの共通アプリケーションスタックを実行する方法に関するいくつかの例があります。 ここを参照してください:
画像内の一般的なタスクを完了する方法の例は、こちらをご覧ください。
これらの画像がどのように構築され、解放されるかの詳細については、ここを参照してください。
デバッグイメージ
無意味な画像は最小限で、シェルへのアクセスが不十分です。 :debug
各言語用に設定された:debug
イメージは、入力するビジーボックスシェルを提供します。
例えば:
cd examples/python2.7/
Dockerfile
を編集して、最終イメージを:debug
ように変更しますDockerfile
:
FROM python:2.7-slim AS build-env
ADD . /app
WORKDIR /app
FROM gcr.io/distroless/python2.7:debug
COPY --from=build-env /app /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
注: lddはシェルスクリプトとしてベースイメージにインストールされていないので、コピーしたりダウンロードしたりすることができます。