
Best Practice Docker画像を構築するのに役立つよりスマートなDockerFileリナー。リナーは、dockerfileをASTに解析し、ASTの上にルールを実行します。シェルチェックの肩に立って、 RUN命令内のbashコードを並べます。
hadolint.github.io/hadolintでオンラインバージョンを確認してください
hadolintローカルに実行して、Dockerfileを並べることができます。
hadolint < Dockerfile >
hadolint --ignore DL3003 --ignore DL3006 < Dockerfile > # exclude specific rules
hadolint --trusted-registry my-company.com:500 < Dockerfile > # Warn when using untrusted FROM images Dockerは救助に来て、ほとんどのプラットフォームでhadolint実行する簡単な方法を提供します。 Dockerfileをdocker runにパイプするだけです。
docker run --rm -i hadolint/hadolint < Dockerfile
# OR
docker run --rm -i ghcr.io/hadolint/hadolint < DockerfileまたはPodmanを使用してください:
podman run --rm -i docker.io/hadolint/hadolint < Dockerfile
# OR
podman run --rm -i ghcr.io/hadolint/hadolint < DockerfileまたはWindows PowerShellを使用してください:
cat .Dockerfile | docker run -- rm - i hadolint / hadolint最新リリースページからOSX、Windows、Linuxの事前に作成されたバイナリをダウンロードできます。ただし、これが機能しない場合は、コンテナ(Docker)、 brew 、またはSourceのインストールに戻ってください。
OSXでは、Brewを使用してhadolintをインストールできます。
brew install hadolint Windowsでは、Scoopを使用してhadolintをインストールできます。
scoop install hadolint nixがインストールされている分布では、 hadolintパッケージを使用してアドホックシェルを実行するか、環境にhadolint永久にインストールできます。
前述のように、 hadolintコンテナ画像として利用可能です。
docker pull hadolint/hadolint
# OR
docker pull ghcr.io/hadolint/hadolintシェルにアクセスできるコンテナが必要な場合は、DebianまたはAlpineのバリエーションを使用してください。
docker pull hadolint/hadolint:latest-debian
# OR
docker pull hadolint/hadolint:latest-alpine
# OR
docker pull ghcr.io/hadolint/hadolint:latest-debian
# OR
docker pull ghcr.io/hadolint/hadolint:latest-alpine hadolintローカルに構築することもできます。バイナリを構築するには、HaskellとCabalビルドツールが必要です。
git clone https://github.com/hadolint/hadolint
&& cd hadolint
&& cabal configure
&& cabal build
&& cabal installVSコードHadolint拡張機能がコンテナでHadolintを使用する場合は、次のラッパースクリプトを使用できます。
#! /bin/bash
dockerfile= " $1 "
shift
docker run --rm -i hadolint/hadolint hadolint " $@ " - < " $dockerfile " hadolint --help hadolint - Dockerfile Linter written in Haskell
Usage: hadolint [-v|--version] [-c|--config FILENAME] [DOCKERFILE...]
[--file-path-in-report FILEPATHINREPORT] [--no-fail]
[--no-color] [-V|--verbose] [-f|--format ARG] [--error RULECODE]
[--warning RULECODE] [--info RULECODE] [--style RULECODE]
[--ignore RULECODE]
[--trusted-registry REGISTRY (e.g. docker.io)]
[--require-label LABELSCHEMA (e.g. maintainer:text)]
[--strict-labels] [--disable-ignore-pragma]
[-t|--failure-threshold THRESHOLD]
Lint Dockerfile for errors and best practices
Available options:
-h,--help Show this help text
-v,--version Show version
-c,--config FILENAME Path to the configuration file
--file-path-in-report FILEPATHINREPORT
The file path referenced in the generated report.
This only applies for the 'checkstyle' format and is
useful when running Hadolint with Docker to set the
correct file path.
--no-fail Don't exit with a failure status code when any rule
is violated
--no-color Don't colorize output
-V,--verbose Enables verbose logging of hadolint's output to
stderr
-f,--format ARG The output format for the results [tty | json |
checkstyle | codeclimate | gitlab_codeclimate | gnu |
codacy | sonarqube | sarif] (default: tty)
--error RULECODE Make the rule `RULECODE` have the level `error`
--warning RULECODE Make the rule `RULECODE` have the level `warning`
--info RULECODE Make the rule `RULECODE` have the level `info`
--style RULECODE Make the rule `RULECODE` have the level `style`
--ignore RULECODE A rule to ignore. If present, the ignore list in the
config file is ignored
--trusted-registry REGISTRY (e.g. docker.io)
A docker registry to allow to appear in FROM
instructions
--require-label LABELSCHEMA (e.g. maintainer:text)
The option --require-label=label:format makes
Hadolint check that the label `label` conforms to
format requirement `format`
--strict-labels Do not permit labels other than specified in
`label-schema`
--disable-ignore-pragma Disable inline ignore pragmas `# hadolint
ignore=DLxxxx`
-t,--failure-threshold THRESHOLD
Exit with failure code only when rules with a
severity equal to or above THRESHOLD are violated.
Accepted values: [error | warning | info | style |
ignore | none] (default: info)
構成ファイルは、グローバルまたはプロジェクトごとに使用できます。 Hadolintは、この順序で次の場所またはそのプラットフォーム固有の等価物の構成ファイルを探し、最初のファイルを排他的に使用します。
$PWD/.hadolint.yaml$XDG_CONFIG_HOME/hadolint.yaml$HOME/.config/hadolint.yaml$HOME/.hadolint/hadolint.yaml or $HOME/hadolint/config.yaml$HOME/.hadolint.yaml Windowsでは、 XDG_CONFIG_HOMEの代わりに%LOCALAPPDATA%環境変数が使用されます。構成ファイルには、 yamlまたはyml拡張機能を備えています。
hadolint Full yaml Configファイルスキーマ
failure-threshold : string # name of threshold level (error | warning | info | style | ignore | none)
format : string # Output format (tty | json | checkstyle | codeclimate | gitlab_codeclimate | gnu | codacy)
ignored : [string] # list of rules
label-schema : # See Linting Labels below for specific label-schema details
author : string # Your name
contact : string # email address
created : timestamp # rfc3339 datetime
version : string # semver
documentation : string # url
git-revision : string # hash
license : string # spdx
no-color : boolean # true | false
no-fail : boolean # true | false
override :
error : [string] # list of rules
warning : [string] # list of rules
info : [string] # list of rules
style : [string] # list of rules
strict-labels : boolean # true | false
disable-ignore-pragma : boolean # true | false
trustedRegistries : string | [string] # registry or list of registries hadolint 、構成ファイルを使用して無視されたルールを指定することをサポートしています。構成ファイルはyaml形式である必要があります。これは、例としての1つの有効な構成ファイルです。
ignored :
- DL3000
- SC1010さらに、 hadolint 、信頼されていないリポジトリの画像がDockerFilesで使用されている場合に警告することができます。以下に示すように、構成ファイルにtrustedRegistriesキーを追加できます。
ignored :
- DL3000
- SC1010
trustedRegistries :
- docker.io
- my-company.com:5000
- " *.gcr.io "特定のルールの重大度をオーバーライドしたい場合は、それを行うこともできます。
override :
error :
- DL3001
- DL3002
warning :
- DL3042
- DL3033
info :
- DL3032
style :
- DL3015 failure-threshold出口は、しきい値を上回る重大度のあるルールが違反されている場合にのみ障害コードを使用します(v2.6.0+で利用可能)
failure-threshold : info
override :
warning :
- DL3042
- DL3033
info :
- DL3032さらに、 --configオプションを使用してコマンドラインにカスタム構成ファイルを渡すことができます
hadolint --config /path/to/config.yaml Dockerfileカスタム構成ファイル(相対パスまたは絶対パスを使用)をコンテナに渡すには、次のコマンドを使用します。
docker run --rm -i -v /your/path/to/hadolint.yaml:/.config/hadolint.yaml hadolint/hadolint < Dockerfile
# OR
docker run --rm -i -v /your/path/to/hadolint.yaml:/.config/hadolint.yaml ghcr.io/hadolint/hadolint < Dockerfile構成ファイルに加えて、Hadolintは環境変数で構成できます。
NO_COLOR=1 # Set or unset. See https://no-color.org
HADOLINT_NOFAIL=1 # Truthy value e.g. 1, true or yes
HADOLINT_VERBOSE=1 # Truthy value e.g. 1, true or yes
HADOLINT_FORMAT=json # Output format (tty | json | checkstyle | codeclimate | gitlab_codeclimate | gnu | codacy | sarif )
HADOLINT_FAILURE_THRESHOLD=info # threshold level (error | warning | info | style | ignore | none)
HADOLINT_OVERRIDE_ERROR=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_OVERRIDE_WARNING=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_OVERRIDE_INFO=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_OVERRIDE_STYLE=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_IGNORE=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_STRICT_LABELS=1 # Truthy value e.g. 1, true or yes
HADOLINT_DISABLE_IGNORE_PRAGMA=1 # Truthy value e.g. 1, true or yes
HADOLINT_TRUSTED_REGISTRIES=docker.io # comma separated list of registry urls
HADOLINT_REQUIRE_LABELS=maintainer:text # comma separated list of label schema items デフォルトとして非Posixシェルを持つベース画像を使用する場合(例:Windowsベースの画像)、特別なプラグマhadolint shell 、ベース画像が使用するシェルを指定できるため、Hadolintはすべてのシェル固有のルールを自動的に無視できます。
FROM mcr.microsoft.com/windows/servercore:ltsc2022
# hadolint shell=powershell
RUN Get-Process notepad | Stop-Processまた、例外を作成したいDockerFileステートメントの真上に特別なコメントを追加することにより、ルールを無視することもできます。このようなコメントは# hadolint ignore=DL3001,SC1081のように見えます。例えば:
# hadolint ignore=DL3006
FROM ubuntu
# hadolint ignore=DL3003,SC1035
RUN cd /tmp && echo "hello!"「インライン無視」というコメントは、それに続くステートメントにのみ適用されます。
ルールは、グローバル無視プラグマを使用して、ファイルごとに無視することもできます。インラインが無視するように機能しますが、次の行ではなくファイル全体に適用されることを除きます。
# hadolint global ignore=DL3003,DL3006,SC1035
FROM ubuntu
RUN cd /tmp && echo "foo" Hadolintは、特定のラベルが存在するかどうかを確認し、事前定義されたラベルスキーマに準拠することができます。まず、ラベルスキーマは、コマンドラインを介して定義する必要があります。
hadolint --require-label author:text --require-label version:semver Dockerfileまたは構成ファイルを介して:
label-schema :
author : text
contact : email
created : rfc3339
version : semver
documentation : url
git-revision : hash
license : spdxラベルの値は、 text 、 url 、 semver 、 hash 、 rfc3339のいずれかにすることができます。
| スキーマ | 説明 |
|---|---|
| 文章 | 何でも |
| RFC3339 | RFC 3339に従ってフォーマットされた時間 |
| semver | セマンティックバージョン |
| URL | RFC 3986で説明されているURI |
| ハッシュ | 短いまたは長いgitハッシュのいずれか |
| spdx | SPDXライセンス識別子 |
| メール | RFC 5322に準拠したメールアドレス |
デフォルトでは、Hadolintは、ラベルスキーマで指定されていないラベルを無視します。このような追加のラベルに警告するには、コマンドラインを使用して、厳格なラベルをオンにします。
hadolint --strict-labels --require-label version:semver Dockerfileまたは構成ファイル:
strict-labels : true厳密なラベルが有効になっているが、ラベルスキーマが指定されていない場合、 hadolintラベルが存在する場合は警告します。
変数を使用して、静的にはなくビルド時に動的にラベルの値を埋めることは一般的なパターンです。
FROM debian:buster
ARG VERSION= "du-jour"
LABEL version= "${VERSION}"これを許可するには、ラベルスキーマはそのラベルの値としてtextを指定する必要があります。
label-schema :
version : text hadolintの大部分を取得するには、CIまたは編集者へのチェックとして、またはコミット前のフックとして統合して、 Dockerfileを書くときに染色することをお勧めします。統合ドキュメントを参照してください。
実装されたルールの不完全なリスト。エラーコードをクリックして、より詳細な情報を取得します。
プレフィックスDLを使用したルールはhadolintからです。ルールの実装を見つけるために、 Rules.hsをご覧ください。
SCプレフィックスのルールはShellCheckからのものです(最も一般的なルールのみがリストされており、さらに数十個あります)。
良いルールのアイデアがある場合は、問題を作成してください。
| ルール | デフォルトの重大度 | 説明 |
|---|---|---|
| DL1001 | 無視する | プラグマを無視することは控えてくださいプラグマ# hadolint ignore=DLxxxx 。 |
| DL3000 | エラー | 絶対的なWorkDirを使用します。 |
| DL3001 | 情報 | 一部のBashコマンドでは、SSH、VIM、シャットダウン、サービス、PS、フリー、トップ、キル、マウント、ifconfigなどのDockerコンテナでそれらを実行する意味がありません。 |
| DL3002 | 警告 | 最後のユーザーはルートではありません。 |
| DL3003 | 警告 | WorkDirを使用してディレクトリに切り替えます。 |
| DL3004 | エラー | Sudoは予測不可能な動作につながるため、使用しないでください。 GOSUのようなツールを使用して、ルートを実施します。 |
| DL3006 | 警告 | 常に画像のバージョンに明示的にタグを付けてください。 |
| DL3007 | 警告 | 最新の使用は、画像が更新される場合、エラーが発生しやすくなります。バージョンをリリースタグに明示的にピン留めします。 |
| DL3008 | 警告 | apt-get installのPINバージョン。 |
| DL3009 | 情報 | 何かをインストールした後、apt-getリストを削除します。 |
| DL3010 | 情報 | ADDを使用して、アーカイブを画像に抽出します。 |
| DL3011 | エラー | 有効なUNIXポートの範囲は0〜65535です。 |
| DL3012 | エラー | 複数のHEALTHCHECK指示。 |
| DL3013 | 警告 | ピップのピンバージョン。 |
| DL3014 | 警告 | -yスイッチを使用します。 |
| DL3015 | 情報 | --no-install-recommendsを指定して、追加のパッケージを避けます。 |
| DL3016 | 警告 | npmのピンバージョン。 |
| DL3018 | 警告 | apk addのピンバージョン。 apk add <package>を使用しますapk add <package>=<version>使用します。 |
| DL3019 | 情報 | --no-cacheスイッチを使用して、パッケージのインストールが完了した場合、使用する必要がないように--update and remot /var/cache/apk/*を削除します。 |
| DL3020 | エラー | ファイルとフォルダーにADD代わりにCOPY使用します。 |
| DL3021 | エラー | 2つ以上の引数でCOPYは、最後の引数が/で終わる必要があります |
| DL3022 | 警告 | COPY --from FROMから以前に定義されたものを参照する必要があります |
| DL3023 | エラー | COPY --from FROM独自を参照することはできません |
| DL3024 | エラー | エイリアスFROM (ステージ名)は一意でなければなりません |
| DL3025 | 警告 | CMDおよびEntryPoint引数の引数JSON表記を使用します |
| DL3026 | エラー | FROM imageで許可されたレジストリのみを使用します |
| DL3027 | 警告 | エンドユーザーツールであることを意図しているため、 aptを使用しないでください。代わりにapt-getまたはapt-cacheを使用してください |
| DL3028 | 警告 | GEMインストールのピンバージョン。 gem install <gem> gem install <gem>:<version>を使用します |
| DL3029 | 警告 | から - プラットフォームフラグを使用しないでください。 |
| DL3030 | 警告 | -yスイッチを使用して手動入力yum install -y <package> |
| DL3032 | 警告 | yum clean all 。 |
| DL3033 | 警告 | yum install -y <package>-<version> |
| DL3034 | 警告 | zypperコマンドから欠落していない非対話スイッチ: zypper install -y |
| DL3035 | 警告 | zypper dist-upgrade使用しないでください。 |
| DL3036 | 警告 | Zypperの使用後にzypper clean欠落しています。 |
| DL3037 | 警告 | zypper install -y <package>[=]<version> 。 |
| DL3038 | 警告 | -yスイッチを使用して、手動入力dnf install -y <package> |
| DL3040 | 警告 | dnf clean all 。 |
| DL3041 | 警告 | dnf install -y <package>-<version> |
| DL3042 | 警告 | pip install --no-cache-dir <package> 。 |
| DL3043 | エラー | ONBUILD 、 FROMまたはmentainter ONBUILD命令内からトリガーされたMAINTAINER 。 |
| DL3044 | エラー | それが定義されている同じENVステートメント内の環境変数を参照しないでください。 |
| DL3045 | 警告 | WORKDIRセットなしで相対的な目的地にCOPY 。 |
| DL3046 | 警告 | flag -lと高いuidのないuseradd 、過度に大きな画像になります。 |
| DL3047 | 情報 | フラグのないwget --progress 、より大きなファイルをダウンロードするときに、過度に肥大化したビルドログになります。 |
| DL3048 | スタイル | 無効なラベルキー |
| DL3049 | 情報 | ラベル<label>がありません。 |
| DL3050 | 情報 | 不必要なラベルが存在します。 |
| DL3051 | 警告 | ラベル<label>は空です。 |
| DL3052 | 警告 | ラベル<label>は有効なURLではありません。 |
| DL3053 | 警告 | ラベル<label>は有効な時間形式ではありません - RFC3339に準拠する必要があります。 |
| DL3054 | 警告 | ラベル<label>は有効なSPDXライセンス識別子ではありません。 |
| DL3055 | 警告 | ラベル<label>は有効なgitハッシュではありません。 |
| DL3056 | 警告 | ラベル<label>は、セマンティックバージョンに準拠していません。 |
| DL3057 | 無視する | HEALTHCHECK指示がありません。 |
| DL3058 | 警告 | ラベル<label>は有効な電子メール形式ではありません - RFC5322に準拠する必要があります。 |
| DL3059 | 情報 | 複数の連続したRUN手順。統合を検討してください。 |
| DL3060 | 情報 | yarn cache clean yarn installが実行された後に掃除されています。 |
| DL3061 | エラー | 無効な命令順序。 dockerfile ARG FROMコメントから始めなければなりません。 |
| DL4000 | エラー | MAINTAINER非推奨です。 |
| DL4001 | 警告 | WGETまたはCURLを使用しますが、両方ではありません。 |
| DL4003 | 警告 | 複数のCMD命令が見つかりました。 |
| DL4004 | エラー | 複数のENTRYPOINT命令が見つかりました。 |
| DL4005 | 警告 | SHELLを使用してデフォルトのシェルを変更します。 |
| DL4006 | 警告 | SHELLオプションを設定します-oパイプフェイルはパイプを入れてRUN前に走る |
| SC1000 | $特別に使用されていないため、逃げる必要があります。 | |
| SC1001 | このコンテキストでは、このc通常の'c'になります。 | |
| SC1007 | 後にスペースを削除=値を割り当てようとしている場合(または空の文字列の場合、 var='' ...を使用してください)。 | |
| SC1010 | done前にセミコロンまたはラインフィードを使用します(または、それを文字通りにするために引用)。 | |
| SC1018 | これはユニコードの非壊れた空間です。それを削除し、スペースとして再入力します。 | |
| SC1035 | ここにスペースが必要です | |
| SC1045 | それはfoo &; bar 、ただfoo & bar 。 | |
| SC1065 | パラメーターを宣言しようとしていますか?しないでください。 ()を使用し、パラメーションを$1 、 $2などと呼びます。 | |
| SC1066 | 割り当ての左側に$を使用しないでください。 | |
| SC1068 | =の周りにスペースを置かないでください。 | |
| SC1077 | コマンドの拡張のために、ティックは左に傾く必要があります( `vs ')。 | |
| SC1078 | この二重引用文字列を閉じるのを忘れましたか? | |
| SC1079 | これは実際には最終的な引用ですが、次の文字のために疑わしいように見えます。 | |
| SC1081 | スクリプトはケースに敏感です。 if 、 Ifはありません。 | |
| SC1083 | この{/}は文字通りです。式(欠落;/n ?)を確認するか、引用してください。 | |
| SC1086 | ループ用のイテレーター名で$を使用しないでください。 | |
| SC1087 | ${array[idx]}のように、アレイを拡張するときはブレースが必要です。 | |
| SC1095 | 関数名とボディの間にスペースまたはラインフィードが必要です。 | |
| SC1097 | 予期しない== 。割り当ての場合、使用= 。比較のために、 [ .. ]または[[ .. ]]を使用します。 | |
| SC1098 | evalを使用するときの特殊文字を引用/脱出する、例えばeval "a=(b)" 。 | |
| SC1099 | #の前にスペースが必要です。 | |
| SC2002 | 役に立たない猫。 cmd < file | ..を考慮してくださいcmd < file | ..またはcmd file | ..その代わり。 | |
| SC2015 | A && B || Cであることに注意してくださいA && B || Cはif-then-elseではありません。 cがtrueの場合に実行される場合があります。 | |
| SC2026 | この単語は引用符の外にあります。 「ネスト」 "「シングルクォート」「代わりに」を意図しましたか? | |
| SC2028 | echoエスケープシーケンスを拡張しません。 printfを検討してください。 | |
| SC2035 | ./*glob*または-- *glob*を使用して、ダッシュ付きの名前はオプションになりません。 | |
| SC2039 | Posix SHでは、何かが定義されていません。 | |
| SC2046 | 単語の分割を防ぐためにこれを引用してください | |
| SC2086 | グローブと単語の分割を防ぐための二重引用。 | |
| SC2140 | 単語は"A"B"C" (bが示されている)の形式です。 "ABC"または"A"B"C"を意味しましたか? | |
| SC2154 | VARは参照されますが、割り当てられていません。 | |
| SC2155 | 返品値のマスキングを避けるために、個別に宣言して割り当てます。 | |
| SC2164 | cd ... || exit cdが失敗した場合にcd ... || exit 。 |
あなたが経験豊富なハスケラーなら、あなたがレビューで私たちのコードを引き裂くならば、私たちは非常に感謝するでしょう。
コンパイルするには、最近のHaskell環境とcabal-install必要になります。
クローンリポジトリ
git clone --recursive [email protected]:hadolint/hadolint.git依存関係をインストールし、ソースをコンパイルします
cabal configure
cabal build(オプション)システムにHadolintをインストールします
cabal installパーサーを試す最も簡単な方法は、REPLを使用することです。
# start the repl
cabal repl
# overload strings to be able to use Text
:set -XOverloadedStrings
# import parser library
import Language.Docker
# parse instruction and look at AST representation
parseText " FROM debian:jessie "ユニットテストでコンパイルして実行します。
cabal configure --enable-tests
cabal build --enable-tests
cabal test統合テストの実行:
./integration_test.sh DockerFile構文は、DockerFileリファレンスで完全に説明されています。 language-dockerプロジェクトのSyntax.hsを見て、AST定義を確認してください。
Hadolintは、多くのライブラリを使用して汚い仕事をしています。特に、Language-DockerはDockerFilesを解析し、ASTを生成するために使用されます。このようなライブラリのカスタムバージョンに対してHadolintを構築するには、次のことを行います。この例では言語ドッカーを使用しますが、他のライブラリでも動作します。
/home/user/repos )では、HadolintとLanguage-Docker Git Repositoriesのクローン cd /home/user/repos
git clone https://github.com/hadolint/hadolint.git
git clone https://github.com/hadolint/language-docker.gitLanguage-Dockerを変更します
Hadolint Repoで、 cabal.projectファイルを編集して、 packagesプロパティが他のリポジトリを指すように
[...]
packages :
.
../language-docker
[...] cd /home/user/repos/hadolint
cabal configure --enable-tests
cabal build --enable-tests
cabal test ReplicatedHQ/DockerFilelint、スーパーライターで使用されるもう1つのライター
RedCoolBeans/DockerLint
Projecatomic/dockerfile_lint