
一個更聰明的Dockerfile林格,可幫助您構建最佳的練習Docker圖像。 Linter將Dockerfile解析為AST,並在AST之上執行規則。它站在ShellCheck的肩膀上,可以在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或源安裝。
在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 Build工具來構建二進製文件。
git clone https://github.com/hadolint/hadolint
&& cd hadolint
&& cabal configure
&& cabal build
&& cabal install如果要在容器中使用Hadolint的VS代碼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中,使用%LOCALAPPDATA%環境變量而不是XDG_CONFIG_HOME 。配置文件可以具有yaml或yml擴展名。
hadolint完整yaml配置文件架構
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格式。這是一個有效的配置文件,例如:
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 shell作為默認值(例如基於Windows的圖像)時,特殊的Pragma 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!"評論“內聯”僅適用於之後的語句。
也可以使用全局忽略Pragma以每文件的基礎忽略規則。它的工作方式與內聯忽略一樣,除了它適用於整個文件,而不僅僅是下一行。
# 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 ,將其作為檢查中的檢查或編輯器或作為預先承諾的掛鉤將其集成在一起是有用的,以便在編寫碼頭時提起您的Dockerfile 。請參閱我們的集成文檔。
實施規則的不完整列表。單擊錯誤代碼以獲取更多詳細信息。
前綴DL的規則來自hadolint 。請查看Rules.hs查找規則的實施。
SC前綴的規則來自ShellCheck (僅列出了最常見的規則,更多的規則)。
如果您有一個好的規則,請創建一個問題。
| 規則 | 默認嚴重性 | 描述 |
|---|---|---|
| DL1001 | 忽略 | 請避免使用內聯忽略Pragmas # hadolint ignore=DLxxxx 。 |
| DL3000 | 錯誤 | 使用絕對工作迪爾。 |
| DL3001 | 資訊 | 對於某些bash命令,在SSH,VIM,關閉,服務,PS,Free,Top,Top,Kill,Mount,IfConfig等碼頭容器中運行它們是沒有意義的。 |
| DL3002 | 警告 | 最後一個用戶不應是根。 |
| DL3003 | 警告 | 使用WorkDir切換到目錄。 |
| DL3004 | 錯誤 | 不要使用sudo會導致不可預測的行為。使用像GOSU這樣的工具來強制根。 |
| DL3006 | 警告 | 始終明確標記圖像的版本。 |
| DL3007 | 警告 | 如果圖像將不斷更新,則使用最新方法容易出現錯誤。將版本明確地固定在發布標籤上。 |
| DL3008 | 警告 | apt-get install中的引腳版本。 |
| DL3009 | 資訊 | 安裝某些內容後,刪除APT-GET列表。 |
| DL3010 | 資訊 | 使用添加以將檔案提取到圖像中。 |
| DL3011 | 錯誤 | 有效的UNIX端口範圍從0到65535。 |
| DL3012 | 錯誤 | 多個HEALTHCHECK說明。 |
| DL3013 | 警告 | PIP中的引腳版本。 |
| DL3014 | 警告 | 使用-y開關。 |
| DL3015 | 資訊 | 避免通過指定--no-install-recommends來避免其他軟件包。 |
| DL3016 | 警告 | npm中的引腳版本。 |
| DL3018 | 警告 | apk add中的PIN版本。而不是apk add <package>使用apk add <package>=<version> 。 |
| DL3019 | 資訊 | 使用--no-cache開關來避免使用時需要--update上升/var/cache/apk/*安裝軟件包時。 |
| DL3020 | 錯誤 | 使用COPY而不是ADD文件和文件夾。 |
| DL3021 | 錯誤 | 具有兩個以上參數的COPY要求最後一個參數以/結尾 |
| DL3022 | 警告 | COPY --from應引用先前定義的FROM |
| DL3023 | 錯誤 | COPY --from不能從別名FROM引用自己的 |
| DL3024 | 錯誤 | FROM別名(舞台名稱)必須是唯一的 |
| DL3025 | 警告 | 使用參數JSON符號用於CMD和入口處參數 |
| DL3026 | 錯誤 | 僅在FROM image中使用允許的註冊表 |
| DL3027 | 警告 | 請勿使用apt ,因為它本來是最終用戶工具,而是使用apt-get或apt-cache |
| DL3028 | 警告 | GEM安裝中的引腳版本。而不是gem install <gem>使用gem install <gem>:<version> |
| DL3029 | 警告 | 請勿使用-platform標誌。 |
| 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 clean使用Zypper後丟失。 |
| 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 ,從內部ONBUILD指令內部FROM或MAINTAINER 。 |
| DL3044 | 錯誤 | 請勿在定義其定義的同一ENV語句中參考環境變量。 |
| DL3045 | 警告 | COPY無WORKDIR集的相對目的地。 |
| DL3046 | 警告 | 沒有標誌-l和高UID的useradd會導致過多的圖像。 |
| DL3047 | 資訊 | 沒有標誌的wget --progress下載較大的文件時將導致過度膨脹的構建日誌。 |
| DL3048 | 風格 | 無效標籤鍵 |
| DL3049 | 資訊 | 標籤<label>缺少。 |
| DL3050 | 資訊 | 存在多餘的標籤。 |
| DL3051 | 警告 | 標籤<label>是空的。 |
| DL3052 | 警告 | Label <label>不是有效的URL。 |
| DL3053 | 警告 | 標籤<label>不是有效的時間格式 - 必須符合RFC3339。 |
| DL3054 | 警告 | Label <label>不是有效的SPDX許可證標識符。 |
| DL3055 | 警告 | 標籤<label>不是有效的git哈希。 |
| DL3056 | 警告 | Label <label>不符合語義版本。 |
| DL3057 | 忽略 | HEALTHCHECK教學缺失。 |
| DL3058 | 警告 | 標籤<label>不是有效的電子郵件格式 - 必須符合RFC5322。 |
| DL3059 | 資訊 | 多個連續RUN說明。考慮合併。 |
| DL3060 | 資訊 | 運行yarn install後, yarn cache clean缺失。 |
| DL3061 | 錯誤 | 無效的說明令。 Dockerfile必須ARG FROM評論開始。 |
| DL4000 | 錯誤 | MAINTAINER被棄用。 |
| DL4001 | 警告 | 使用WGET或Curl,但不能同時使用。 |
| DL4003 | 警告 | 找到了多個CMD指令。 |
| DL4004 | 錯誤 | 找到多個ENTRYPOINT指令。 |
| DL4005 | 警告 | 使用SHELL更改默認外殼。 |
| DL4006 | 警告 | 在用管道RUN之前,請設置SHELL Option -O PipeFail |
| SC1000 | $不是專門使用的,因此應逃脫。 | |
| SC1001 | 在這種情況下,此c將是常規的'c' 。 | |
| SC1007 | 在=試圖分配值(或為空字符串,使用var='' ... )之後刪除空間。 | |
| SC1010 | 在done之前,請使用semicolon或lineFeed(或引用將其進行字面意思)。 | |
| SC1018 | 這是一個非破壞空間。將其刪除並重新輸入空間。 | |
| SC1035 | 您需要在這裡一個空間 | |
| SC1045 | 這不是foo &; bar ,只是foo & bar 。 | |
| SC1065 | 試圖聲明參數?不。使用() ,並將參數稱為$1 , $2等。 | |
| SC1066 | 不要在作業的左側使用$。 | |
| SC1068 | 不要在分配中放置=周圍的空間。 | |
| SC1077 | 為了擴展命令,tick應向左傾斜(`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 | ..反而。 | |
| SC2015 | 請注意, A && B || C不是else。 C可能在A為真時運行。 | |
| 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 。 |
如果您是一個經驗豐富的Haskeller,那麼如果您在評論中將我們的代碼分開,我們將非常感謝。
要編譯,您將需要最近的Haskell環境和cabal-install 。
克隆存儲庫
git clone --recursive [email protected]:hadolint/hadolint.git安裝依賴項和編譯源
cabal configure
cabal build(可選)在系統上安裝Hadolint
cabal install嘗試解析器的最簡單方法是使用替補。
# 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項目中的語法即可查看AST定義。
Hadolint使用許多圖書館來完成骯髒的工作。特別是,語言騙子用於解析Dockerfiles並產生AST,然後可以分析該AST。要針對此類庫的自定義版本構建Hadolint,請執行以下操作。此示例使用語言騙子,但它也可以與任何其他庫一起使用。
/home/user/repos )克隆Hadolint和語言docker git存儲庫中 cd /home/user/repos
git clone https://github.com/hadolint/hadolint.git
git clone https://github.com/hadolint/language-docker.git對語言騙子進行修改
在Hadolint倉庫中,編輯cabal.project文件,以便packages屬性也指向另一個存儲庫
[...]
packages :
.
../language-docker
[...] cd /home/user/repos/hadolint
cabal configure --enable-tests
cabal build --enable-tests
cabal test ReplicatedHQ/DockerFileLint,超級鏈接使用的另一個Linter
RedCoolbeans/dockerlint
projectatomic/dockerfile_lint