Sign inSign up

lukasmartinelli/hadolint

By lukasmartinelli

โ€ขUpdated almost 9 years ago

Dockerfile linter written in Haskell http://hadolint.lukasmartinelli.ch/

Image
4

100K+

lukasmartinelli/hadolint repository overview

โ Haskell Dockerfile Linter Linux/OSX Build Status Windows Build status GPL-3 licensed

pipecat

A smarter Dockerfile linter that helps you build best practice Docker imagesโ . The linter is parsing the Dockerfile into an AST and performs rules on top of the AST. It is standing on the shoulders of Shellcheckโ  to lint the Bash code inside RUN instructions.

:globe_with_meridians: Check the online version on hadolint.lukasmartinelli.chโ 

Screenshot

โ How to use

You can run hadolint locally to lint your Dockerfile.

hadolint <Dockerfile>
hadolint --ignore DL3003 --ignore DL3006 <Dockerfile> # exclude specific rules

Docker comes to the rescue to provide an easy way how to run hadolint on most platforms. Just pipe your Dockerfile to docker run:

docker run --rm -i lukasmartinelli/hadolint < Dockerfile

โ Install

You can download prebuilt binaries for OSX, Windows and Linux from the latest release pageโ . However they may not run on your system configuration since I am not able to provide completely statically linked binaries. Fall back to brew, source installation or Docker if it doesn't work for you.

If you are on OSX you can use brewโ  to install hadolint.

brew install hadolint

You can also build hadolint locally. You need Haskellโ  and the stack build toolโ  to build the binary.

git clone https://github.com/lukasmartinelli/hadolint
cd hadolint
stack build

โ Rules

Incomplete list of implemented rules. Click on the error code to get more detailed information.

  • Rules with the prefix DL originate from hadolint. Take a look into Rules.hs to find the implementation of the rules.
  • Rules with the SC prefix originate from ShellCheck (Only the most common rules are listed, there are dozens more)

Please create an issueโ  if you have an idea for a good rule.

RuleDescription
DL3000โ Use absolute WORKDIR.
DL3001โ For some bash commands it makes no sense running them in a Docker container like ssh, vim, shutdown, service, ps, free, top, kill, mount, ifconfig.
DL3002โ Do not switch to root USER.
DL3003โ Use WORKDIR to switch to a directory.
DL3004โ Do not use sudo as it leads to unpredictable behavior. Use a tool like gosu to enforce root.
DL3005โ Do not use apt-get upgrade or dist-upgrade.
DL3007โ Using latest is prone to errors if the image will ever update. Pin the version explicitly to a release tag.
DL3006โ Always tag the version of an image explicitly.
DL3008โ Pin versions in apt get install.
DL3009โ Delete the apt-get lists after installing something.
DL3010โ Use ADD for extracting archives into an image.
DL3011โ Valid UNIX ports range from 0 to 65535.
DL3012โ Provide an email address or URL as maintainer.
DL3013โ Pin versions in pip.
DL3014โ Use the -y switch.
DL3015โ Avoid additional packages by specifying --no-install-recommends.
DL3016โ Pin versions in npm.
DL3020โ Use COPY instead of ADD for files and folders.
DL4000โ Specify a maintainer of the Dockerfile.
DL4001โ Either use Wget or Curl but not both.
DL4003โ Multiple CMD instructions found.
DL4004โ Multiple ENTRYPOINT instructions found.
DL4005โ Use SHELL to change the default shell.
SC1000โ $ is not used specially and should therefore be escaped.
SC1001โ This \c will be a regular 'c' in this context.
SC1007โ Remove space after = if trying to assign a value (or for empty string, use var='' ...).
SC1010โ Use semicolon or linefeed before done (or quote to make it literal).
SC1018โ This is a unicode non-breaking space. Delete it and retype as space.
SC1035โ You need a space here
SC1045โ It's not foo &; bar, just foo & bar.
SC1065โ Trying to declare parameters? Don't. Use () and refer to params as $1, $2 etc.
SC1066โ Don't use $ on the left side of assignments.
SC1068โ Don't put spaces around the = in assignments.
SC1077โ For command expansion, the tick should slant left (` vs ยด).
SC1078โ Did you forget to close this double quoted string?
SC1079โ This is actually an end quote, but due to next char it looks suspect.
SC1081โ Scripts are case sensitive. Use if, not If.
SC1083โ This {/} is literal. Check expression (missing ;/\n?) or quote it.
SC1086โ Don't use $ on the iterator name in for loops.
SC1087โ Braces are required when expanding arrays, as in ${array[idx]}.
SC1095โ You need a space or linefeed between the function name and body.
SC1097โ Unexpected ==. For assignment, use =. For comparison, use [/[[.
SC1098โ Quote/escape special characters when using eval, e.g. eval "a=(b)".
SC1099โ You need a space before the #.
SC2002โ Useless cat. Consider `cmd < file
SC2015โ Note that `A && B
SC2026โ This word is outside of quotes. Did you intend to 'nest '"'single quotes'"' instead'?
SC2028โ echo won't expand escape sequences. Consider printf.
SC2035โ Use ./*glob* or -- *glob* so names with dashes won't become options.
SC2046โ Quote this to prevent word splitting
SC2086โ Double quote to prevent globbing and word splitting.
SC2140โ Word is on the form "A"B"C" (B indicated). Did you mean "ABC" or "A\"B\"C"?
SC2154โ var is referenced but not assigned.
SC2164โ Use `cd ...

โ Develop

This is my first Haskell program. If you are an experienced Haskeller I would be really thankful if you would tear my code apart in a review.

โ Setup
  1. Clone repository
    git clone --recursive [email protected]:lukasmartinelli/hadolint.git
    
  2. Install the dependencies
    stack install
    
โ REPL

The easiest way to try out the parser is using the REPL.

# start the repl
stack repl
# parse instruction and look at AST representation
parseString "FROM debian:jessie"
โ Tests

Run unit tests.

stack test

Run integration tests.

./integration_test.sh
โ Parsing

The Dockerfile is parsed using Parsecโ  and is using the lexer Lexer.hs and parser Parser.hs.

โ AST

Dockerfile syntax is fully described in the Dockerfile referenceโ . Just take a look at Syntax.hs to see the AST definition.

โ Alternatives

Tag summary

Content type

Image

Digest

Size

4.5 MB

Last updated

almost 9 years ago

docker pull lukasmartinelli/hadolint