Dockerfile

Dockerfile のビルド命令、パッケージ管理、コンテナーの実行設定を確認するための文書です。

文書一覧

文書 パス
ADDの代わりにCOPYを使用 dockerfile/add_instead_of_copy
CMDとENTRYPOINTのJSON形式未使用 dockerfile/not_using_json_in_cmd_and_entrypoint_arguments
COPY するファイルの所有者と書き込み権限の確認 dockerfile/chown_flag_exists
自分自身のビルドステージを参照する COPY --from dockerfile/copy_from_references_current_from_alias
FROM のプラットフォーム指定の意図の確認 dockerfile/using_platform_with_from
コンテナーのヘルスチェック設定の確認 dockerfile/healthcheck_instruction_missing
MAINTAINER 命令の使用 dockerfile/maintainer_instruction_being_used
RUN cdによる作業ディレクトリの設定 dockerfile/run_command_cd_instead_of_workdir
Dockerfile の自動化における apt 使用の確認 dockerfile/run_using_apt
RUNでのsudo使用 dockerfile/run_using_sudo
RUNによる既定シェルの変更 dockerfile/changing_default_shell_using_run_command
コンテナーの SSH ポート宣言の確認 dockerfile/exposing_port_22
USER 命令がない Dockerfile dockerfile/missing_user_instruction
apk のインストールキャッシュ管理の確認 dockerfile/apk_add_using_local_cache_path
apk パッケージのバージョンが未固定 dockerfile/unpinned_package_version_in_apk_add
apt-get のパッケージバージョンが指定されていない dockerfile/apt_get_install_pin_version_not_defined
apt-get のインストール確認入力の点検 dockerfile/apt_get_missing_flags_to_avoid_manual_input
apt-get の推奨パッケージのインストール範囲の確認 dockerfile/apt_get_not_avoiding_additional_packages
apt-get のパッケージ一覧削除の確認 dockerfile/apt_get_install_lists_were_not_deleted
dnf のインストールキャッシュ削除の確認 dockerfile/missing_dnf_clean_all
dnf のインストール確認入力の点検 dockerfile/missing_flag_from_dnf_install
dnf パッケージのバージョンが未固定 dockerfile/missing_version_specification_in_dnf_install
gem パッケージのバージョンが未固定 dockerfile/gem_install_without_version
ベースイメージに latest タグを使用 dockerfile/image_version_using_latest
npm パッケージのバージョンが未固定 dockerfile/npm_install_without_pinned_version
コンテナーイメージに含まれる pip キャッシュの確認 dockerfile/pip_install_keeping_cached_packages
pip パッケージのバージョンが未固定 dockerfile/unpinned_package_version_in_pip_install
パッケージインデックス更新とインストールの分離の確認 dockerfile/update_instruction_alone
wgetとcurlの重複利用の確認 dockerfile/run_using_wget_and_curl
yum のインストールキャッシュ削除の確認 dockerfile/yum_clean_all_missing
yum のインストール確認入力の点検 dockerfile/yum_install_allows_manual_input
yum パッケージのバージョンが未固定 dockerfile/yum_install_without_version
zypperの非対話オプションの不足 dockerfile/missing_zypper_non_interactive_switch
zypper のキャッシュ削除の確認 dockerfile/missing_zypper_clean
zypper のパッケージバージョンが固定されていない dockerfile/zypper_install_without_version
Dockerfile のレイヤーと一時ファイル管理の確認 dockerfile/multiple_run_add_copy_instructions_listed
最後の実行ユーザーが root の Dockerfile dockerfile/last_user_is_root
ベースイメージのバージョンが未指定 dockerfile/image_version_not_explicit
RUN の診断コマンドの使用の確認 dockerfile/run_utilities_and_posix_commands
ビルドステージ名の重複 dockerfile/same_alias_in_different_froms
同じビルドステージ内の複数の CMD 命令 dockerfile/multiple_cmd_instructions_listed
同じビルドステージ内の複数の ENTRYPOINT 命令 dockerfile/multiple_entrypoint_instructions_listed
複数のコピー元に対する COPY の宛先パスの誤り dockerfile/copy_with_more_than_two_arguments_not_ending_with_slash
リモートアーティファクトの整合性検証の確認 dockerfile/curl_or_wget_instead_of_add
EXPOSE のポート番号の範囲の確認 dockerfile/unix_ports_out_of_range
ビルドステージの番号による参照 dockerfile/using_unnamed_build_stages
相対パスのWORKDIRの確認 dockerfile/workdir_path_not_absolute
パイプ処理でpipefailが未設定 dockerfile/shell_running_a_pipe_without_pipefail_flag

関連ページ48

ADDの代わりにCOPYを使用

ローカルファイルにはCOPYを使い、リモートの成果物は別途検証してください。

CMDとENTRYPOINTのJSON形式未使用

CMDとENTRYPOINTの引数を明示し、終了シグナルの処理を確認してください。

COPY するファイルの所有者と書き込み権限の確認

実行アカウントには必要なデータへの書き込み権限だけを付与し、アプリケーションコードを保護してください。

自分自身のビルドステージを参照する COPY --from

COPY --from が現在のステージ自身を参照しないように依存関係を修正してください。

FROM のプラットフォーム指定の意図の確認

各ビルドステージのプラットフォームを実際の対象に合わせてください。

コンテナーのヘルスチェック設定の確認

プロセスの稼働だけでなく、サービスの状態を確認するチェックを構成してください。

MAINTAINER 命令の使用

非推奨の MAINTAINER 命令を LABEL に置き換え、イメージのメタデータを管理してください。

RUN cdによる作業ディレクトリの設定

後続の命令にも適用する作業ディレクトリはWORKDIRで指定してください。

Dockerfile の自動化における apt 使用の確認

自動化するコマンドには apt-get と apt-cache を使ってください。

RUNでのsudo使用

RUNの実行ユーザーを明確にし、不要なsudoを削除してください。

RUNによる既定シェルの変更

Dockerfileの既定シェルはSHELL命令で明示してください。

コンテナーの SSH ポート宣言の確認

必要なサービスポートだけを宣言し、実際のポート公開と SSH アクセスは別途制限してください。

USER 命令がない Dockerfile

最終イメージの既定ユーザーを確認し、アプリケーションを必要最小限の権限で実行してください。

apk のインストールキャッシュ管理の確認

最終イメージに不要な apk キャッシュが残らないインストール方法を選んでください。

apk パッケージのバージョンが未固定

apk add でパッケージのバージョンを指定しないと、Docker のビルド結果が変わる可能性があります。

apt-get のパッケージバージョンが指定されていない

apt-get install のパッケージバージョンを指定してビルド結果の予期しない変化を減らし、セキュリティ更新も継続して管理します。

apt-get のインストール確認入力の点検

apt-get の確認を自動化し、パッケージ固有の追加入力も確認してください。

apt-get の推奨パッケージのインストール範囲の確認

必要なパッケージと依存関係を確認し、不要な推奨パッケージを減らしてください。

apt-get のパッケージ一覧削除の確認

パッケージのインストールと一覧の削除を同じ RUN 内で行ってください。

dnf のインストールキャッシュ削除の確認

dnf のインストールとキャッシュ削除を同じ RUN 内で行ってください。

dnf のインストール確認入力の点検

dnf の確認を自動化し、入力なしでビルドが完了することをテストしてください。

dnf パッケージのバージョンが未固定

dnf install でバージョンを指定しないと、Docker のビルド結果が変わる可能性があります。

gem パッケージのバージョンが未固定

gem のバージョンを指定しないと、Docker のビルド時に含まれるパッケージが変わる可能性があります。

ベースイメージに latest タグを使用

latest タグを使うと、後の Docker ビルドで異なるベースイメージが選ばれる可能性があります。

npm パッケージのバージョンが未固定

npm パッケージのバージョンを固定しないと、Docker のビルド結果が変わる可能性があります。

コンテナーイメージに含まれる pip キャッシュの確認

最終イメージに不要な pip キャッシュを残さないでください。

pip パッケージのバージョンが未固定

Python パッケージのバージョンを指定しないと、Docker のビルド時に含まれるライブラリが変わる可能性があります。

パッケージインデックス更新とインストールの分離の確認

インデックス更新とパッケージのインストールを同じ RUN 内で行ってください。

wgetとcurlの重複利用の確認

同じ要件を満たせる場合は、ダウンロードツールを統一してください。

yum のインストールキャッシュ削除の確認

yum のインストールとキャッシュ削除を同じ RUN 内で行ってください。

yum のインストール確認入力の点検

yum の確認を自動化し、追加入力なしでビルドできることを確認してください。

yum パッケージのバージョンが未固定

yum パッケージのバージョンを指定しないと、Docker のビルド内容が変わる可能性があります。

zypperの非対話オプションの不足

zypperの確認入力に対処し、自動ビルドの結果を確認してください。

zypper のキャッシュ削除の確認

インストールと zypper のキャッシュ削除を同じ RUN 内で完了してください。

zypper のパッケージバージョンが固定されていない

検証したパッケージバージョンを指定し、セキュリティ更新計画も管理してください。

Dockerfile のレイヤーと一時ファイル管理の確認

インストールと一時ファイル削除を適切にまとめ、必要なビルドキャッシュの構造は維持してください。

最後の実行ユーザーが root の Dockerfile

root が必要なビルド処理を終えた後は、アプリケーションの既定の実行ユーザーを非 root アカウントに変更してください。

ベースイメージのバージョンが未指定

ベースイメージのバージョンを指定しないと、Docker のビルド結果が変わる可能性があります。

RUN の診断コマンドの使用の確認

ビルドに必要なコマンドを実行し、対話型の診断は別途行ってください。

ビルドステージ名の重複

FROMステージごとに一意の名前を指定してください。

同じビルドステージ内の複数の CMD 命令

各ビルドステージで意図する既定の実行コマンドを明確にしてください。

同じビルドステージ内の複数の ENTRYPOINT 命令

各ステージで実際に使うエントリーポイントと既定の引数を明確にしてください。

複数のコピー元に対する COPY の宛先パスの誤り

複数のファイルを COPY する場合、宛先ディレクトリのパスを / で終えてください。

リモートアーティファクトの整合性検証の確認

リモートファイルは、信頼できるチェックサムや署名で検証してから使用してください。

EXPOSE のポート番号の範囲の確認

サービスが実際に待ち受けるポートを有効な番号で宣言してください。

ビルドステージの番号による参照

COPY --fromでは役割が分かるステージ名を使ってください。

相対パスのWORKDIRの確認

作業ディレクトリの基準を絶対パスで明示してください。

パイプ処理でpipefailが未設定

パイプの前段の失敗も検出するようにシェルを設定してください。