キャッシュ制御とシークレット管理によるイメージ構築
このステップでは、Docker ビルドキャッシュの制御方法と、BuildKit のsecret
マウントタイプを使用したビルドプロセス中のシークレット処理方法について学びます。ビルドキャッシュはビルドを大幅に高速化できますが、無効にする必要がある場合もあります。シークレットを安全に処理することは、機密情報がイメージレイヤーに埋め込まれるのを防ぐために重要です。
まず、~/project
ディレクトリにいることを確認してください:
cd ~/project
キャッシュ制御対象のステップとシークレット処理のデモンストレーションを行うため、Dockerfile
を修正しましょう。タイムスタンプを含むファイル作成ステップと、仮想的にシークレットを使用するステップを追加します。
Dockerfile
を編集用に開きます:
nano Dockerfile
タイムスタンプファイルを作成するRUN
コマンドとシークレット使用のプレースホルダーを含むように内容を変更します:
FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
RUN echo "Build time: $(date)" > /app/build_info.txt
## これはシークレットを使用するコマンドのプレースホルダーです
## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
CMD ["cowsay", "$MESSAGE"]
RUN echo "Build time: $(date)" > /app/build_info.txt
を追加しました。このコマンドは、このレイヤーがビルドされた時刻を含む/app/build_info.txt
ファイルを作成します。デフォルトでは、Docker はレイヤーをキャッシュします。このRUN
コマンドより前の命令を変更せずにイメージを複数回ビルドすると、このレイヤーはキャッシュから提供され、タイムスタンプは更新されません。
Ctrl + X
、次にY
、そしてEnter
を押して変更したDockerfile
を保存します。
では、新しいタグmy-cached-image
でイメージをビルドしましょう。
docker build -t my-cached-image .
出力を確認してください。最近イメージをビルドした場合、いくつかのステップで---> Using cache
が表示されるかもしれません。
キャッシュ制御を実証するため、今度は--no-cache
フラグを使用してキャッシュを完全に無効にしてイメージを再度ビルドします。
docker build --no-cache -t my-no-cache-image .
命令が変更されていなくても、Docker がすべてのレイヤーを再構築するのがわかります。これは、すべての依存関係を新しく取得したい場合や、前回のビルドがキャッシュを破損する形で失敗した場合に有用です。
次に、シークレットの処理について説明します。コメントアウトされた行## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
は、BuildKit でシークレットを使用する方法を示しています。これを使用するには、BuildKit を有効にし(最近の Docker バージョンではデフォルトで有効になっていることが多い)、--secret
フラグを使用してビルド中にシークレットを提供する必要があります。
例えば、シークレットを含むmysecret.txt
というファイルがある場合、次のようにビルドします(このコマンドはmysecret.txt
ファイルがなく、行がコメントアウトされているためそのままでは動作しませんが、構文を示しています):
## docker build --secret id=mysecret,src=mysecret.txt -t my-secret-image .
RUN --mount=type=secret,id=mysecret
命令は、シークレットの内容をビルドステップ中のみ/run/secrets/mysecret
で利用可能にします。シークレットは最終的なイメージレイヤーには含まれません。これは、API キーやパスワードなどの機密情報をビルド中に処理する安全な方法です。
シークレットファイルがなく、行がコメントアウトされているため、シークレット関連のビルドコマンドは実行しません。ただし、--no-cache
の概念とsecret
マウントタイプを理解することは、ビルドを制御し、機密データを処理する上で重要です。