
linter dockerfile ที่ฉลาดกว่าที่ช่วยให้คุณสร้างภาพนักเทียบท่าที่ดีที่สุด linter วิเคราะห์ dockerfile เป็น AST และดำเนินการตามกฎที่ด้านบนของ AST มันยืนอยู่บนไหล่ของ Shellcheck เพื่อขูดรหัส bash ภายในคำแนะนำ RUN
ตรวจสอบเวอร์ชันออนไลน์บน 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 คุณสามารถดาวน์โหลดไบนารี prebuilt สำหรับ OSX, Windows และ Linux ได้จากหน้ารุ่นล่าสุด อย่างไรก็ตามหากสิ่งนี้ไม่ได้ผลสำหรับคุณโปรดกลับไปที่คอนเทนเนอร์ (นักเทียบท่า) การติด brew หรือการติดตั้งแหล่งที่มา
บน OSX คุณสามารถใช้ Brew เพื่อติดตั้ง hadolint
brew install hadolint บน Windows คุณสามารถใช้ Scoop เพื่อติดตั้ง hadolint
scoop install hadolint ในการแจกแจงที่ติดตั้ง nix คุณสามารถใช้แพ็คเกจ hadolint เพื่อเรียกใช้เชลล์ ad-hoc หรือติดตั้ง 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 installหากคุณต้องการให้ส่วนขยาย Hadolint VS ใช้ Hadolint ในคอนเทนเนอร์คุณสามารถใช้สคริปต์ wrapper ต่อไปนี้:
#! /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 Full yaml Config File Schema
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นอกเหนือจากไฟล์ config แล้ว 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 เมื่อใช้ภาพพื้นฐานที่มีเชลล์ที่ไม่ใช่แบบไม่ได้เป็นค่าเริ่มต้น (เช่นภาพที่ใช้ Windows) hadolint shell พิเศษสามารถระบุว่า 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 |
| กรรไกร | เวอร์ชันความหมาย |
| url | URI ตามที่อธิบายไว้ใน RFC 3986 |
| กัญชา | ไม่ว่าจะเป็นแฮช 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 | ไม่สนใจ | โปรดงดใช้อินไลน์ละเว้น pragmas # hadolint ignore=DLxxxx |
| DL3000 | ข้อผิดพลาด | ใช้ Workdir สัมบูรณ์ |
| DL3001 | ข้อมูล | สำหรับคำสั่งทุบตีบางอย่างมันไม่สมเหตุสมผลที่จะใช้พวกเขาในคอนเทนเนอร์ Docker เช่น SSH, VIM, Shutdown, Service, PS, Free, Top, Kill, Mount, Ifconfig |
| DL3002 | คำเตือน | ผู้ใช้คนสุดท้ายไม่ควรเป็นรูท |
| DL3003 | คำเตือน | ใช้ workdir เพื่อเปลี่ยนเป็นไดเรกทอรี |
| DL3004 | ข้อผิดพลาด | อย่าใช้ sudo เนื่องจากนำไปสู่พฤติกรรมที่คาดเดาไม่ได้ ใช้เครื่องมือเช่น GOSU เพื่อบังคับใช้รูท |
| DL3006 | คำเตือน | ติดแท็กเวอร์ชันของภาพเสมออย่างชัดเจน |
| DL3007 | คำเตือน | การใช้ล่าสุดมีแนวโน้มที่จะเกิดข้อผิดพลาดหากภาพจะอัปเดต ตรึงเวอร์ชันลงในแท็กรีลีสอย่างชัดเจน |
| DL3008 | คำเตือน | PIN เวอร์ชันใน apt-get install |
| DL3009 | ข้อมูล | ลบรายการ APT-GET หลังจากติดตั้งบางอย่าง |
| DL3010 | ข้อมูล | ใช้เพิ่มสำหรับการแยกคลังเก็บลงในภาพ |
| DL3011 | ข้อผิดพลาด | พอร์ต UNIX ที่ถูกต้องมีตั้งแต่ 0 ถึง 65535 |
| DL3012 | ข้อผิดพลาด | คำแนะนำ HEALTHCHECK หลายคำแนะนำ |
| DL3013 | คำเตือน | PIN เวอร์ชันใน PIP |
| DL3014 | คำเตือน | ใช้สวิตช์ -y |
| DL3015 | ข้อมูล | หลีกเลี่ยงแพ็คเกจเพิ่มเติมโดยระบุ --no-install-recommends |
| DL3016 | คำเตือน | PIN เวอร์ชันใน npm |
| DL3018 | คำเตือน | PIN เวอร์ชันใน apk add แทนที่จะ apk add <package> ใช้ apk add <package>=<version> |
| DL3019 | ข้อมูล | ใช้สวิตช์ --no-cache ไม่จำเป็นต้องใช้ --update และลบ /var/cache/apk/* เมื่อติดตั้งแพ็คเกจเสร็จแล้ว |
| DL3020 | ข้อผิดพลาด | ใช้ COPY แทน ADD สำหรับไฟล์และโฟลเดอร์ |
| DL3021 | ข้อผิดพลาด | COPY ด้วยอาร์กิวเมนต์มากกว่า 2 ข้อต้องใช้อาร์กิวเมนต์สุดท้ายที่จะจบลงด้วย / |
| DL3022 | คำเตือน | COPY --from ควรอ้างอิงที่กำหนดไว้ก่อนหน้านี้ FROM นามแฝง |
| DL3023 | ข้อผิดพลาด | COPY --from ไม่สามารถอ้างอิงได้จาก FROM |
| DL3024 | ข้อผิดพลาด | FROM นามแฝง (ชื่อขั้นตอน) จะต้องไม่ซ้ำกัน |
| DL3025 | คำเตือน | ใช้ข้อโต้แย้งสัญกรณ์ JSON สำหรับ CMD และ entryPoint อาร์กิวเมนต์ |
| DL3026 | ข้อผิดพลาด | ใช้เฉพาะรีจิสทรีที่อนุญาตใน FROM image |
| DL3027 | คำเตือน | อย่าใช้ apt เนื่องจากเป็นเครื่องมือของผู้ใช้ปลายทางใช้ apt-get หรือ apt-cache แทน |
| DL3028 | คำเตือน | PIN เวอร์ชันในการติดตั้งอัญมณี แทนที่จะ gem install <gem> ใช้ gem install <gem>:<version> |
| DL3029 | คำเตือน | อย่าใช้ -แพลตฟอร์มธงจาก |
| DL3030 | คำเตือน | ใช้สวิตช์ -y เพื่อหลีกเลี่ยง yum install -y <package> |
| DL3032 | คำเตือน | yum clean all ที่หายไปหลังจากคำสั่ง yum |
| 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 ที่หายไปหลังจากคำสั่ง DNF |
| DL3041 | คำเตือน | ระบุเวอร์ชันด้วย dnf install -y <package>-<version> |
| DL3042 | คำเตือน | หลีกเลี่ยงไดเร็กทอรีแคชด้วย pip install --no-cache-dir <package> |
| DL3043 | ข้อผิดพลาด | ONBUILD FROM หรือ MAINTAINER ที่ถูกเรียกจากภายในคำแนะนำ ONBUILD |
| DL3044 | ข้อผิดพลาด | อย่าอ้างถึงตัวแปรสภาพแวดล้อมภายในคำสั่ง ENV เดียวกันกับที่กำหนดไว้ |
| DL3045 | คำเตือน | COPY ไปยังปลายทางสัมพัทธ์โดยไม่ต้องตั้งค่า WORKDIR |
| DL3046 | คำเตือน | useradd ที่ไม่มี FLAG -l และ UID สูงจะส่งผลให้ภาพขนาดใหญ่มากเกินไป |
| DL3047 | ข้อมูล | wget โดยไม่ต้องตั้งค่าสถานะ --progress หน้าจะส่งผลให้บันทึกบิลด์ป่องมากเกินไปเมื่อดาวน์โหลดไฟล์ขนาดใหญ่ |
| DL3048 | สไตล์ | คีย์ฉลากไม่ถูกต้อง |
| DL3049 | ข้อมูล | ฉลาก <label> หายไป |
| DL3050 | ข้อมูล | ฉลากฟุ่มเฟือยนำเสนอ |
| DL3051 | คำเตือน | ฉลาก <label> ว่างเปล่า |
| DL3052 | คำเตือน | ฉลาก <label> ไม่ใช่ URL ที่ถูกต้อง |
| DL3053 | คำเตือน | Label <label> ไม่ใช่รูปแบบเวลาที่ถูกต้อง - ต้องสอดคล้องกับ RFC3339 |
| DL3054 | คำเตือน | Label <label> ไม่ใช่ตัวระบุใบอนุญาต SPDX ที่ถูกต้อง |
| DL3055 | คำเตือน | ฉลาก <label> ไม่ใช่แฮช Git ที่ถูกต้อง |
| DL3056 | คำเตือน | ฉลาก <label> ไม่สอดคล้องกับการกำหนดเวอร์ชันความหมาย |
| DL3057 | ไม่สนใจ | การสอน HEALTHCHECK หายไป |
| DL3058 | คำเตือน | Label <label> ไม่ใช่รูปแบบอีเมลที่ถูกต้อง - ต้องสอดคล้องกับ RFC5322 |
| DL3059 | ข้อมูล | คำแนะนำ RUN ต่อเนื่องหลายครั้ง พิจารณาการรวม |
| DL3060 | ข้อมูล | yarn cache clean หายไปหลังจาก yarn install ถูกเรียกใช้ |
| DL3061 | ข้อผิดพลาด | คำสั่งคำสั่งไม่ถูกต้อง DockerFile ต้องเริ่มต้น FROM ARG หรือความคิดเห็น |
| DL4000 | ข้อผิดพลาด | MAINTAINER เลิกใช้ |
| DL4001 | คำเตือน | ใช้ wget หรือ curl แต่ไม่ใช่ทั้งสองอย่าง |
| DL4003 | คำเตือน | พบคำแนะนำ CMD หลายคำ |
| DL4004 | ข้อผิดพลาด | พบคำแนะนำ ENTRYPOINT หลายครั้ง |
| DL4005 | คำเตือน | ใช้ SHELL เพื่อเปลี่ยนเชลล์เริ่มต้น |
| DL4006 | คำเตือน | ตั้งค่าตัวเลือก SHELL -o pipefail ก่อน RUN ด้วยท่อในนั้น |
| SC1000 | $ ไม่ได้ใช้เป็นพิเศษและควรหลบหนี | |
| SC1001 | c นี้จะเป็น 'c' ปกติในบริบทนี้ | |
| SC1007 | ลบพื้นที่หลังจาก = หากพยายามกำหนดค่า (หรือสำหรับสตริงว่างให้ใช้ var='' ... ) | |
| SC1010 | ใช้เซมิโคลอนหรือฟีด linefeed ก่อนที่ done (หรือใบเสนอราคาเพื่อให้เป็นตัวอักษร) | |
| SC1018 | นี่คือพื้นที่ที่ไม่ทำลาย Unicode ลบและพิมพ์ใหม่เป็นพื้นที่ | |
| SC1035 | คุณต้องการพื้นที่ที่นี่ | |
| SC1045 | ไม่ใช่ foo &; bar เพียงแค่ foo & bar | |
| SC1065 | พยายามประกาศพารามิเตอร์หรือไม่? อย่า. ใช้ () และอ้างถึง params เป็น $1 , $2 ฯลฯ | |
| SC1066 | อย่าใช้ $ ทางด้านซ้ายของการมอบหมาย | |
| SC1068 | อย่าใส่ช่องว่างรอบ = ในการมอบหมาย | |
| SC1077 | สำหรับการขยายคำสั่งเห็บควรเอียงไปทางซ้าย (`vs ´) | |
| SC1078 | คุณลืมที่จะปิดสตริงที่ยกสองครั้งนี้หรือไม่? | |
| SC1079 | นี่เป็นคำพูดจบ แต่เนื่องจากถ่านต่อไปจึงดูสงสัย | |
| SC1081 | สคริปต์เป็นตัวพิมพ์เล็ก ใช้ if ไม่ใช่ If | |
| SC1083 | {/} นี้เป็นตัวอักษร ตรวจสอบนิพจน์ (หายไป ;/n ?) หรืออ้าง | |
| SC1086 | อย่าใช้ $ บนชื่อตัววนซ้ำในสำหรับลูป | |
| SC1087 | จำเป็นต้องใช้เครื่องมือจัดฟันเมื่อขยายอาร์เรย์เช่นเดียวกับใน ${array[idx]} | |
| SC1095 | คุณต้องมีพื้นที่หรือฟีด linefeed ระหว่างชื่อฟังก์ชั่นและร่างกาย | |
| SC1097 | ไม่คาดคิด == สำหรับการมอบหมายใช้ = สำหรับการเปรียบเทียบใช้ [ .. ] หรือ [[ .. ]] | |
| SC1098 | Quote/Escape อักขระพิเศษเมื่อใช้ eval เช่น eval "a=(b)" | |
| SC1099 | คุณต้องมีพื้นที่ก่อน # | |
| SC2002 | แมวไร้ประโยชน์ พิจารณา cmd < file | .. หรือ cmd file | .. แทน. | |
| SC2015 | โปรดทราบว่า A && B || C ไม่ได้เป็นเช่นนั้น C อาจทำงานเมื่อ A เป็นจริง | |
| SC2026 | คำนี้อยู่นอกคำพูด คุณตั้งใจจะ 'Nest' '' Single Quotes '' 'แทน' หรือไม่? | |
| SC2028 | echo จะไม่ขยายลำดับการหลบหนี พิจารณา printf | |
| SC2035 | ใช้ ./*glob* หรือ -- *glob* ดังนั้นชื่อที่มีขีดกลางจะไม่กลายเป็นตัวเลือก | |
| SC2039 | ใน Posix SH มีบางอย่างที่ไม่ได้กำหนด | |
| SC2046 | อ้างสิ่งนี้เพื่อป้องกันการแยกคำ | |
| SC2086 | คำพูดสองครั้งเพื่อป้องกันการแยกรอบและการแยกคำ | |
| SC2140 | Word อยู่ในรูปแบบ "A"B"C" (B ระบุ) คุณหมายถึง "ABC" หรือ "A"B"C" ? | |
| SC2154 | VAR ถูกอ้างอิง แต่ไม่ได้รับมอบหมาย | |
| SC2155 | ประกาศและกำหนดแยกต่างหากเพื่อหลีกเลี่ยงค่าการส่งคืนการปิดบัง | |
| SC2164 | ใช้ cd ... || exit ในกรณีที่ cd ล้มเหลว |
หากคุณเป็น Haskeller ที่มีประสบการณ์เราจะขอบคุณมากถ้าคุณจะฉีกรหัสของเราออกจากกันในการตรวจสอบ
ในการรวบรวมคุณจะต้องมีสภาพแวดล้อม 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 เพื่อดูคำจำกัดความของ AST
Hadolint ใช้ห้องสมุดหลายแห่งในการทำงานที่สกปรก โดยเฉพาะอย่างยิ่งภาษา Docker ใช้เพื่อแยกวิเคราะห์ Dockerfiles และผลิต AST ซึ่งสามารถวิเคราะห์ได้ ในการสร้าง Hadolint กับไลบรารีรุ่นที่กำหนดเองให้ทำสิ่งต่อไปนี้ ตัวอย่างนี้ใช้ docker ภาษา แต่มันจะใช้งานได้กับห้องสมุดอื่น ๆ เช่นกัน
/home/user/repos ) clone hadolint และที่เก็บ Git Git ภาษา cd /home/user/repos
git clone https://github.com/hadolint/hadolint.git
git clone https://github.com/hadolint/language-docker.gitทำการปรับเปลี่ยนของคุณเป็นนักดื่มภาษา
ใน Hadolint repo แก้ไขไฟล์ cabal.project เช่นที่ packages คุณสมบัติชี้ไปที่ repo อื่น ๆ ด้วย
[...]
packages :
.
../language-docker
[...] cd /home/user/repos/hadolint
cabal configure --enable-tests
cabal build --enable-tests
cabal test ReplicatedHq/DockerFilelint
Redcoolbeans/Dockerlint
Projectatomic/Dockerfile_lint