diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
+# Haskell Dockerfile Linter
+
 [![Build Status][github-actions-img]][github-actions]
 [![GPL-3 licensed][license-img]][license]
 [![GitHub release][release-img]][release]
-[![Github downloads][downloads-img]]()
+![Github downloads][downloads-img]
 <img align="right" alt="pipecat" width="150"
 src="https://hadolint.github.io/hadolint/img/cat_container.png" />
 
-# Haskell Dockerfile Linter
-
 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
@@ -32,14 +32,16 @@
 
 ```bash
 $ docker run --rm -i hadolint/hadolint < Dockerfile
-# or
+# OR
 $ docker run --rm -i ghcr.io/hadolint/hadolint < Dockerfile
 ```
 
 or if you are using Windows PowerShell:
+
 ```powershell
 > cat .\Dockerfile | docker run --rm -i hadolint/hadolint
 ```
+
 ## Install
 
 You can download prebuilt binaries for OSX, Windows and Linux from the latest
@@ -52,7 +54,8 @@
 brew install hadolint
 ```
 
-On Windows you can use [scoop](https://github.com/lukesampson/scoop) to install `hadolint`.
+On Windows you can use [scoop](https://github.com/lukesampson/scoop) to
+install `hadolint`.
 
 ```batch
 scoop install hadolint
@@ -61,45 +64,129 @@
 As shown before, `hadolint` is available as a Docker container:
 
 ```bash
-$ docker pull hadolint/hadolint
-# or
-$ docker pull ghcr.io/hadolint/hadolint
+docker pull hadolint/hadolint
+# OR
+docker pull ghcr.io/hadolint/hadolint
 ```
 
 If you need a Docker container with shell access, use the Debian or Alpine
 variants of the Docker image:
 
 ```bash
-$ docker pull hadolint/hadolint:latest-debian
-$ docker pull hadolint/hadolint:latest-alpine
-# or
-$ docker pull ghcr.io/hadolint/hadolint:latest-debian
-$ docker pull ghcr.io/hadolint/hadolint:latest-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
 ```
 
 You can also build `hadolint` locally. You need [Haskell][] and the [stack][]
 build tool to build the binary.
 
 ```bash
-git clone https://github.com/hadolint/hadolint
-cd hadolint
-stack install
+git clone https://github.com/hadolint/hadolint \
+&& cd hadolint \
+&& stack install
 ```
 
+## CLI
+
+```bash
+hadolint --help
+```
+
+```text
+hadolint - Dockerfile Linter written in Haskell
+
+Usage: hadolint [-v|--version] [--no-fail] [--no-color] [-c|--config FILENAME] 
+                [-V|--verbose] [-f|--format ARG] [DOCKERFILE...] 
+                [--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] [-t|--failure-theshold THRESHOLD]
+  Lint Dockerfile for errors and best practices
+
+Available options:
+  -h,--help                Show this help text
+  -v,--version             Show version
+  --no-fail                Don't exit with a failure status code when any rule
+                           is violated
+  --no-color               Don't colorize output
+  -c,--config FILENAME     Path to the configuration file
+  -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 |
+                           codacy] (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`
+  -t,--failure-theshold THRESHOLD
+                           Exit with failure code only when rules with a
+                           severity above THRESHOLD are violated. Accepted
+                           values: [error | warning | info | style | ignore |
+                           none] (default: info)
+```
+
 ## Configure
 
-`hadolint` supports specifying the ignored rules using a configuration file. The configuration
-file should be in `yaml` format. This is one valid configuration file as an example:
+Configuration files can be used globally or per project. By default,
+`hadolint` will look for a configuration file in the current directory
+with the name `.hadolint.yaml` or `.hadolint.yml`
 
+`hadolint` full `yaml` config file schema
+
 ```yaml
+failure-threshold: string               # name of threshold level (error | warning | info | style | ignore | none)                
+format: string                          # Output format (tty | json | checkstyle | codeclimate | gitlab_codeclimate | 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
+trustedRegistries: string | [string]    # registry or list of registries
+```
+
+`hadolint` supports specifying the ignored rules using a configuration
+file. The configuration file should be in `yaml` format. This is one
+valid configuration file as an example:
+
+```yaml
 ignored:
   - DL3000
   - SC1010
 ```
 
-Additionally, `hadolint` can warn you when images from untrusted repositories are being
-used in Dockerfiles, you can append the `trustedRegistries` keys to the configuration
-file as shown below:
+Additionally, `hadolint` can warn you when images from untrusted
+repositories are being used in Dockerfiles, you can append the
+`trustedRegistries` keys to the configuration file as shown below:
 
 ```yaml
 ignored:
@@ -112,6 +199,7 @@
 ```
 
 If you want to override the severity of specific rules, you can do that too:
+
 ```yaml
 override:
   error:
@@ -126,14 +214,24 @@
     - DL3015
 ```
 
-Configuration files can be used globally or per project. By default, `hadolint` will look for
-a configuration file in the current directory with the name `.hadolint.yaml` or
-`.hadolint.yml`
+`failure-threshold` Exit with failure code only when rules with a
+severity above THRESHOLD are violated (Available in v2.6.0+)
 
-The global configuration file should be placed in the folder specified by `XDG_CONFIG_HOME`,
-with the name `hadolint.yaml` or `hadolint.yml`. In summary, the following locations are valid
-for the configuration file, in order or preference:
+```yaml
+failure-threshold: info
+warning:
+    - DL3042
+    - DL3033
+  info:
+    - DL3032
+```
 
+The global configuration file should be placed in the folder
+specified by `XDG_CONFIG_HOME`,
+with the name `hadolint.yaml` or `hadolint.yml`. In summary, the
+following locations are valid for the configuration file, in order
+or preference:
+
 - `$PWD/.hadolint.yaml`
 - `$XDG_CONFIG_HOME/hadolint.yaml`
 - `~/.config/hadolint.yaml`
@@ -147,19 +245,20 @@
 hadolint --config /path/to/config.yaml Dockerfile
 ```
 
-To pass a custom configuration file (using relative or absolute path) to a container,
-use the following command:
+To pass a custom configuration file (using relative or absolute path) to 
+a container, use the following command:
 
 ```bash
-$ 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
+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
 ```
 
 ## Inline ignores
 
-It is also possible to ignore rules by using a special comment directly above the Dockerfile
-instruction you want to make an exception for. Ignore rule comments look like
+It is also possible to ignore rules by using a special comment directly
+above the Dockerfile instruction you want to make an exception for.
+Ignore rule comments look like
 `# hadolint ignore=DL3001,SC1081`. For example:
 
 ```dockerfile
@@ -177,9 +276,11 @@
 Hadolint has the ability to check that specific labels be present and conform
 to a predefined label schema.
 First a label schema must be defined either via commandline:
+
 ```bash
-$ hadolint --require-label author:text --require-label version:semver Dockerfile
+hadolint --require-label author:text --require-label version:semver Dockerfile
 ```
+
 or via config file:
 
 ```yaml
@@ -192,6 +293,7 @@
   git-revision: hash
   license: spdx
 ```
+
 The value of a label can be either of `text`, `url`, `semver`, `hash` or
 `rfc3339`:
 | Schema  | Description                                        |
@@ -206,25 +308,33 @@
 
 By default, Hadolint ignores any label not specified in the label schema. To
 warn on such additional labels, turn on strict labels:
+
 ```bash
-$ hadolint --strict-labels --require-label version:semver Dockerfile
+hadolint --strict-labels --require-label version:semver Dockerfile
 ```
+
 or in the config file:
+
 ```yaml
 strict-labels: true
 ```
+
 When strict labels is enabled, but no label schema has been specified, Hadolint
 will warn if any label is present.
 
 ### Note on dealing with variables in labels
+
 It is a common pattern to fill the value of a label not statically, but rather
 dynamically at build time by using a variable:
+
 ```dockerfile
 FROM debian:buster
 ARG VERSION="du-jour"
 LABEL version="${VERSION}"
 ```
+
 To allow this, the label schema must specify `text` as value for that label:
+
 ```yaml
 label-schema:
   version: text
@@ -253,109 +363,107 @@
 common rules are listed, there are dozens more)
 
 Please [create an issue][] if you have an idea for a good rule.
-
-| Rule                                                         | Description                                                                                                                                         |
-|:-------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------|
-| [DL3000](https://github.com/hadolint/hadolint/wiki/DL3000)   | Use absolute WORKDIR.                                                                                                                               |
-| [DL3001](https://github.com/hadolint/hadolint/wiki/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](https://github.com/hadolint/hadolint/wiki/DL3002)   | Last user should not be root.                                                                                                                       |
-| [DL3003](https://github.com/hadolint/hadolint/wiki/DL3003)   | Use WORKDIR to switch to a directory.                                                                                                               |
-| [DL3004](https://github.com/hadolint/hadolint/wiki/DL3004)   | Do not use sudo as it leads to unpredictable behavior. Use a tool like gosu to enforce root.                                                        |
-| [DL3005](https://github.com/hadolint/hadolint/wiki/DL3005)   | Do not use apt-get dist-upgrade.                                                                                                                    |
-| [DL3006](https://github.com/hadolint/hadolint/wiki/DL3006)   | Always tag the version of an image explicitly.                                                                                                      |
-| [DL3007](https://github.com/hadolint/hadolint/wiki/DL3007)   | Using latest is prone to errors if the image will ever update. Pin the version explicitly to a release tag.                                         |
-| [DL3008](https://github.com/hadolint/hadolint/wiki/DL3008)   | Pin versions in apt-get install.                                                                                                                    |
-| [DL3009](https://github.com/hadolint/hadolint/wiki/DL3009)   | Delete the apt-get lists after installing something.                                                                                                |
-| [DL3010](https://github.com/hadolint/hadolint/wiki/DL3010)   | Use ADD for extracting archives into an image.                                                                                                      |
-| [DL3011](https://github.com/hadolint/hadolint/wiki/DL3011)   | Valid UNIX ports range from 0 to 65535.                                                                                                             |
-| [DL3012](https://github.com/hadolint/hadolint/wiki/DL3012)   | Multiple `HEALTHCHECK` instructions.                                                                                                                |
-| [DL3013](https://github.com/hadolint/hadolint/wiki/DL3013)   | Pin versions in pip.                                                                                                                                |
-| [DL3014](https://github.com/hadolint/hadolint/wiki/DL3014)   | Use the `-y` switch.                                                                                                                                |
-| [DL3015](https://github.com/hadolint/hadolint/wiki/DL3015)   | Avoid additional packages by specifying --no-install-recommends.                                                                                    |
-| [DL3016](https://github.com/hadolint/hadolint/wiki/DL3016)   | Pin versions in `npm`.                                                                                                                              |
-| [DL3017](https://github.com/hadolint/hadolint/wiki/DL3017)   | Do not use `apk upgrade`.                                                                                                                           |
-| [DL3018](https://github.com/hadolint/hadolint/wiki/DL3018)   | Pin versions in apk add. Instead of `apk add <package>` use `apk add <package>=<version>`.                                                          |
-| [DL3019](https://github.com/hadolint/hadolint/wiki/DL3019)   | Use the `--no-cache` switch to avoid the need to use `--update` and remove `/var/cache/apk/*` when done installing packages.                        |
-| [DL3020](https://github.com/hadolint/hadolint/wiki/DL3020)   | Use `COPY` instead of `ADD` for files and folders.                                                                                                  |
-| [DL3021](https://github.com/hadolint/hadolint/wiki/DL3021)   | `COPY` with more than 2 arguments requires the last argument to end with `/`                                                                        |
-| [DL3022](https://github.com/hadolint/hadolint/wiki/DL3022)   | `COPY --from` should reference a previously defined `FROM` alias                                                                                    |
-| [DL3023](https://github.com/hadolint/hadolint/wiki/DL3023)   | `COPY --from` cannot reference its own `FROM` alias                                                                                                 |
-| [DL3024](https://github.com/hadolint/hadolint/wiki/DL3024)   | `FROM` aliases (stage names) must be unique                                                                                                         |
-| [DL3025](https://github.com/hadolint/hadolint/wiki/DL3025)   | Use arguments JSON notation for CMD and ENTRYPOINT arguments                                                                                        |
-| [DL3026](https://github.com/hadolint/hadolint/wiki/DL3026)   | Use only an allowed registry in the FROM image                                                                                                      |
-| [DL3027](https://github.com/hadolint/hadolint/wiki/DL3027)   | Do not use `apt` as it is meant to be a end-user tool, use `apt-get` or `apt-cache` instead                                                         |
-| [DL3028](https://github.com/hadolint/hadolint/wiki/DL3028)   | Pin versions in gem install. Instead of `gem install <gem>` use `gem install <gem>:<version>`                                                       |
-| [DL3029](https://github.com/hadolint/hadolint/wiki/DL3029)   | Do not use --platform flag with FROM.                                                                                                               |
-| [DL3030](https://github.com/hadolint/hadolint/wiki/DL3030)   | Use the `-y` switch to avoid manual input `yum install -y <package>`                                                                                |
-| [DL3031](https://github.com/hadolint/hadolint/wiki/DL3031)   | Do not use `yum update`                                                                                                                             |
-| [DL3032](https://github.com/hadolint/hadolint/wiki/DL3032)   | `yum clean all` missing after yum command.                                                                                                          |
-| [DL3033](https://github.com/hadolint/hadolint/wiki/DL3033)   | Specify version with `yum install -y <package>-<version>`                                                                                           |
-| [DL3034](https://github.com/hadolint/hadolint/wiki/DL3034)   | Non-interactive switch missing from `zypper` command: `zypper install -y`                                                                           |
-| [DL3035](https://github.com/hadolint/hadolint/wiki/DL3035)   | Do not use `zypper update`.                                                                                                                         |
-| [DL3036](https://github.com/hadolint/hadolint/wiki/DL3036)   | `zypper clean` missing after zypper use.                                                                                                            |
-| [DL3037](https://github.com/hadolint/hadolint/wiki/DL3037)   | Specify version with `zypper install -y <package>[=]<version>`.                                                                                     |
-| [DL3038](https://github.com/hadolint/hadolint/wiki/DL3038)   | Use the `-y` switch to avoid manual input `dnf install -y <package>`                                                                                |
-| [DL3039](https://github.com/hadolint/hadolint/wiki/DL3039)   | Do not use `dnf update`                                                                                                                             |
-| [DL3040](https://github.com/hadolint/hadolint/wiki/DL3040)   | `dnf clean all` missing after dnf command.                                                                                                          |
-| [DL3041](https://github.com/hadolint/hadolint/wiki/DL3041)   | Specify version with `dnf install -y <package>-<version>`                                                                                           |
-| [DL3042](https://github.com/hadolint/hadolint/wiki/DL3042)   | Avoid cache directory with `pip install --no-cache-dir <package>`.                                                                                  |
-| [DL3043](https://github.com/hadolint/hadolint/wiki/DL3043)   | `ONBUILD`, `FROM` or `MAINTAINER` triggered from within `ONBUILD` instruction.                                                                      |
-| [DL3044](https://github.com/hadolint/hadolint/wiki/DL3044)   | Do not refer to an environment variable within the same `ENV` statement where it is defined.                                                        |
-| [DL3045](https://github.com/hadolint/hadolint/wiki/DL3045)   | `COPY` to a relative destination without `WORKDIR` set.                                                                                             |
-| [DL3046](https://github.com/hadolint/hadolint/wiki/DL3046)   | `useradd` without flag `-l` and high UID will result in excessively large Image.                                                                    |
-| [DL3047](https://github.com/hadolint/hadolint/wiki/DL3047)   | `wget` without flag `--progress` will result in excessively bloated build logs when downloading larger files.                                       |
-| [DL3048](https://github.com/hadolint/hadolint/wiki/DL3048)   | Invalid Label Key                                                                                                                                   |
-| [DL3049](https://github.com/hadolint/hadolint/wiki/DL3049)   | Label `<label>` is missing.                                                                                                                         |
-| [DL3050](https://github.com/hadolint/hadolint/wiki/DL3050)   | Superfluous label(s) present.                                                                                                                       |
-| [DL3051](https://github.com/hadolint/hadolint/wiki/DL3051)   | Label `<label>` is empty.                                                                                                                           |
-| [DL3052](https://github.com/hadolint/hadolint/wiki/DL3052)   | Label `<label>` is not a valid URL.                                                                                                                 |
-| [DL3053](https://github.com/hadolint/hadolint/wiki/DL3053)   | Label `<label>` is not a valid time format - must be conform to RFC3339.                                                                            |
-| [DL3054](https://github.com/hadolint/hadolint/wiki/DL3054)   | Label `<label>` is not a valid SPDX license identifier.                                                                                             |
-| [DL3055](https://github.com/hadolint/hadolint/wiki/DL3055)   | Label `<label>` is not a valid git hash.                                                                                                            |
-| [DL3056](https://github.com/hadolint/hadolint/wiki/DL3056)   | Label `<label>` does not conform to semantic versioning.                                                                                            |
-| [DL3057](https://github.com/hadolint/hadolint/wiki/DL3057)   | `HEALTHCHECK` instruction missing.                                                                                                                  |
-| [DL3058](https://github.com/hadolint/hadolint/wiki/DL3058)   | Label `<label>` is not a valid email format - must be conform to RFC5322.                                                                           |
-| [DL3059](https://github.com/hadolint/hadolint/wiki/DL3059)   | Multiple consecutive `RUN` instructions. Consider consolidation.                                                                                    |
-| [DL3060](https://github.com/hadolint/hadolint/wiki/DL3060)   | `yarn cache clean` missing after `yarn install` was run.                                                                                            |
-| [DL4000](https://github.com/hadolint/hadolint/wiki/DL4000)   | MAINTAINER is deprecated.                                                                                                                           |
-| [DL4001](https://github.com/hadolint/hadolint/wiki/DL4001)   | Either use Wget or Curl but not both.                                                                                                               |
-| [DL4003](https://github.com/hadolint/hadolint/wiki/DL4003)   | Multiple `CMD` instructions found.                                                                                                                  |
-| [DL4004](https://github.com/hadolint/hadolint/wiki/DL4004)   | Multiple `ENTRYPOINT` instructions found.                                                                                                           |
-| [DL4005](https://github.com/hadolint/hadolint/wiki/DL4005)   | Use `SHELL` to change the default shell.                                                                                                            |
-| [DL4006](https://github.com/hadolint/hadolint/wiki/DL4006)   | Set the `SHELL` option -o pipefail before `RUN` with a pipe in it                                                                                   |
-| [SC1000](https://github.com/koalaman/shellcheck/wiki/SC1000) | `$` is not used specially and should therefore be escaped.                                                                                          |
-| [SC1001](https://github.com/koalaman/shellcheck/wiki/SC1001) | This `\c` will be a regular `'c'`  in this context.                                                                                                 |
-| [SC1007](https://github.com/koalaman/shellcheck/wiki/SC1007) | Remove space after `=` if trying to assign a value (or for empty string, use `var='' ...`).                                                         |
-| [SC1010](https://github.com/koalaman/shellcheck/wiki/SC1010) | Use semicolon or linefeed before `done` (or quote to make it literal).                                                                              |
-| [SC1018](https://github.com/koalaman/shellcheck/wiki/SC1018) | This is a unicode non-breaking space. Delete it and retype as space.                                                                                |
-| [SC1035](https://github.com/koalaman/shellcheck/wiki/SC1035) | You need a space here                                                                                                                               |
-| [SC1045](https://github.com/koalaman/shellcheck/wiki/SC1045) | It's not `foo &; bar`, just `foo & bar`.                                                                                                            |
-| [SC1065](https://github.com/koalaman/shellcheck/wiki/SC1065) | Trying to declare parameters? Don't. Use `()` and refer to params as `$1`, `$2` etc.                                                                |
-| [SC1066](https://github.com/koalaman/shellcheck/wiki/SC1066) | Don't use $ on the left side of assignments.                                                                                                        |
-| [SC1068](https://github.com/koalaman/shellcheck/wiki/SC1068) | Don't put spaces around the `=` in assignments.                                                                                                     |
-| [SC1077](https://github.com/koalaman/shellcheck/wiki/SC1077) | For command expansion, the tick should slant left (\` vs ´).                                                                                        |
-| [SC1078](https://github.com/koalaman/shellcheck/wiki/SC1078) | Did you forget to close this double-quoted string?                                                                                                  |
-| [SC1079](https://github.com/koalaman/shellcheck/wiki/SC1079) | This is actually an end quote, but due to next char, it looks suspect.                                                                              |
-| [SC1081](https://github.com/koalaman/shellcheck/wiki/SC1081) | Scripts are case sensitive. Use `if`, not `If`.                                                                                                     |
-| [SC1083](https://github.com/koalaman/shellcheck/wiki/SC1083) | This `{/}` is literal. Check expression (missing `;/\n`?) or quote it.                                                                              |
-| [SC1086](https://github.com/koalaman/shellcheck/wiki/SC1086) | Don't use `$` on the iterator name in for loops.                                                                                                    |
-| [SC1087](https://github.com/koalaman/shellcheck/wiki/SC1087) | Braces are required when expanding arrays, as in `${array[idx]}`.                                                                                   |
-| [SC1095](https://github.com/koalaman/shellcheck/wiki/SC1095) | You need a space or linefeed between the function name and body.                                                                                    |
-| [SC1097](https://github.com/koalaman/shellcheck/wiki/SC1097) | Unexpected `==`. For assignment, use `=`. For comparison, use `[ .. ]` or `[[ .. ]]`.                                                               |
-| [SC1098](https://github.com/koalaman/shellcheck/wiki/SC1098) | Quote/escape special characters when using `eval`, e.g. `eval "a=(b)"`.                                                                             |
-| [SC1099](https://github.com/koalaman/shellcheck/wiki/SC1099) | You need a space before the `#`.                                                                                                                    |
-| [SC2002](https://github.com/koalaman/shellcheck/wiki/SC2002) | Useless cat. Consider <code>cmd < file &#124; ..</code> or <code>cmd file &#124; ..</code> instead.                                                 |
-| [SC2015](https://github.com/koalaman/shellcheck/wiki/SC2015) | Note that <code>A && B &#124;&#124; C</code> is not if-then-else. C may run when A is true.                                                         |
-| [SC2026](https://github.com/koalaman/shellcheck/wiki/SC2026) | This word is outside of quotes. Did you intend to 'nest '"'single quotes'"' instead'?                                                               |
-| [SC2028](https://github.com/koalaman/shellcheck/wiki/SC2028) | `echo` won't expand escape sequences. Consider `printf`.                                                                                            |
-| [SC2035](https://github.com/koalaman/shellcheck/wiki/SC2035) | Use `./*glob*` or `-- *glob*` so names with dashes won't become options.                                                                            |
-| [SC2039](https://github.com/koalaman/shellcheck/wiki/SC2039) | In POSIX sh, something is undefined.                                                                                                                |
-| [SC2046](https://github.com/koalaman/shellcheck/wiki/SC2046) | Quote this to prevent word splitting                                                                                                                |
-| [SC2086](https://github.com/koalaman/shellcheck/wiki/SC2086) | Double quote to prevent globbing and word splitting.                                                                                                |
-| [SC2140](https://github.com/koalaman/shellcheck/wiki/SC2140) | Word is in the form `"A"B"C"` (B indicated). Did you mean `"ABC"` or `"A\"B\"C"`?                                                                   |
-| [SC2154](https://github.com/koalaman/shellcheck/wiki/SC2154) | var is referenced but not assigned.                                                                                                                 |
-| [SC2155](https://github.com/koalaman/shellcheck/wiki/SC2155) | Declare and assign separately to avoid masking return values.                                                                                       |
-| [SC2164](https://github.com/koalaman/shellcheck/wiki/SC2164) | Use <code>cd ... &#124;&#124; exit</code> in case `cd` fails.                                                                                       |
+<!--lint disable maximum-line-length-->
+| Rule                                                         | Default Severity | Description                                                                                                                                         |
+|:-------------------------------------------------------------|:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------|
+| [DL3000](https://github.com/hadolint/hadolint/wiki/DL3000)   | Error            | Use absolute WORKDIR.                                                                                                                               |
+| [DL3001](https://github.com/hadolint/hadolint/wiki/DL3001)   | Info             | 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](https://github.com/hadolint/hadolint/wiki/DL3002)   | Warning          | Last user should not be root.                                                                                                                       |
+| [DL3003](https://github.com/hadolint/hadolint/wiki/DL3003)   | Warning          | Use WORKDIR to switch to a directory.                                                                                                               |
+| [DL3004](https://github.com/hadolint/hadolint/wiki/DL3004)   | Error            | Do not use sudo as it leads to unpredictable behavior. Use a tool like gosu to enforce root.                                                        |
+| [DL3005](https://github.com/hadolint/hadolint/wiki/DL3005)   | Error            | Do not use apt-get dist-upgrade.                                                                                                                    |
+| [DL3006](https://github.com/hadolint/hadolint/wiki/DL3006)   | Warning          | Always tag the version of an image explicitly.                                                                                                      |
+| [DL3007](https://github.com/hadolint/hadolint/wiki/DL3007)   | Warning          | Using latest is prone to errors if the image will ever update. Pin the version explicitly to a release tag.                                         |
+| [DL3008](https://github.com/hadolint/hadolint/wiki/DL3008)   | Warning          | Pin versions in apt-get install.                                                                                                                    |
+| [DL3009](https://github.com/hadolint/hadolint/wiki/DL3009)   | Info             | Delete the apt-get lists after installing something.                                                                                                |
+| [DL3010](https://github.com/hadolint/hadolint/wiki/DL3010)   | Info             | Use ADD for extracting archives into an image.                                                                                                      |
+| [DL3011](https://github.com/hadolint/hadolint/wiki/DL3011)   | Error            | Valid UNIX ports range from 0 to 65535.                                                                                                             |
+| [DL3012](https://github.com/hadolint/hadolint/wiki/DL3012)   | Error            | Multiple `HEALTHCHECK` instructions.                                                                                                                |
+| [DL3013](https://github.com/hadolint/hadolint/wiki/DL3013)   | Warning          | Pin versions in pip.                                                                                                                                |
+| [DL3014](https://github.com/hadolint/hadolint/wiki/DL3014)   | Warning          | Use the `-y` switch.                                                                                                                                |
+| [DL3015](https://github.com/hadolint/hadolint/wiki/DL3015)   | Info             | Avoid additional packages by specifying --no-install-recommends.                                                                                    |
+| [DL3016](https://github.com/hadolint/hadolint/wiki/DL3016)   | Warning          | Pin versions in `npm`.                                                                                                                              |
+| [DL3018](https://github.com/hadolint/hadolint/wiki/DL3018)   | Warning          | Pin versions in apk add. Instead of `apk add <package>` use `apk add <package>=<version>`.                                                          |
+| [DL3019](https://github.com/hadolint/hadolint/wiki/DL3019)   | Info             | Use the `--no-cache` switch to avoid the need to use `--update` and remove `/var/cache/apk/*` when done installing packages.                        |
+| [DL3020](https://github.com/hadolint/hadolint/wiki/DL3020)   | Error            | Use `COPY` instead of `ADD` for files and folders.                                                                                                  |
+| [DL3021](https://github.com/hadolint/hadolint/wiki/DL3021)   | Error            | `COPY` with more than 2 arguments requires the last argument to end with `/`                                                                        |
+| [DL3022](https://github.com/hadolint/hadolint/wiki/DL3022)   | Warning          | `COPY --from` should reference a previously defined `FROM` alias                                                                                    |
+| [DL3023](https://github.com/hadolint/hadolint/wiki/DL3023)   | Error            | `COPY --from` cannot reference its own `FROM` alias                                                                                                 |
+| [DL3024](https://github.com/hadolint/hadolint/wiki/DL3024)   | Error            | `FROM` aliases (stage names) must be unique                                                                                                         |
+| [DL3025](https://github.com/hadolint/hadolint/wiki/DL3025)   | Warning          | Use arguments JSON notation for CMD and ENTRYPOINT arguments                                                                                        |
+| [DL3026](https://github.com/hadolint/hadolint/wiki/DL3026)   | Error            | Use only an allowed registry in the FROM image                                                                                                      |
+| [DL3027](https://github.com/hadolint/hadolint/wiki/DL3027)   | Warning          | Do not use `apt` as it is meant to be a end-user tool, use `apt-get` or `apt-cache` instead                                                         |
+| [DL3028](https://github.com/hadolint/hadolint/wiki/DL3028)   | Warning          | Pin versions in gem install. Instead of `gem install <gem>` use `gem install <gem>:<version>`                                                       |
+| [DL3029](https://github.com/hadolint/hadolint/wiki/DL3029)   | Warning          | Do not use --platform flag with FROM.                                                                                                               |
+| [DL3030](https://github.com/hadolint/hadolint/wiki/DL3030)   | Warning          | Use the `-y` switch to avoid manual input `yum install -y <package>`                                                                                |
+| [DL3032](https://github.com/hadolint/hadolint/wiki/DL3032)   | Warning          | `yum clean all` missing after yum command.                                                                                                          |
+| [DL3033](https://github.com/hadolint/hadolint/wiki/DL3033)   | Warning          | Specify version with `yum install -y <package>-<version>`                                                                                           |
+| [DL3034](https://github.com/hadolint/hadolint/wiki/DL3034)   | Warning          | Non-interactive switch missing from `zypper` command: `zypper install -y`                                                                           |
+| [DL3035](https://github.com/hadolint/hadolint/wiki/DL3035)   | Warning          | Do not use `zypper dist-upgrade`.                                                                                                                  	|
+| [DL3036](https://github.com/hadolint/hadolint/wiki/DL3036)   | Warning          | `zypper clean` missing after zypper use.                                                                                                            |
+| [DL3037](https://github.com/hadolint/hadolint/wiki/DL3037)   | Warning          | Specify version with `zypper install -y <package>[=]<version>`.                                                                                     |
+| [DL3038](https://github.com/hadolint/hadolint/wiki/DL3038)   | Warning          | Use the `-y` switch to avoid manual input `dnf install -y <package>`                                                                                |
+| [DL3040](https://github.com/hadolint/hadolint/wiki/DL3040)   | Warning          | `dnf clean all` missing after dnf command.                                                                                                          |
+| [DL3041](https://github.com/hadolint/hadolint/wiki/DL3041)   | Warning          | Specify version with `dnf install -y <package>-<version>`                                                                                           |
+| [DL3042](https://github.com/hadolint/hadolint/wiki/DL3042)   | Warning          | Avoid cache directory with `pip install --no-cache-dir <package>`.                                                                                  |
+| [DL3043](https://github.com/hadolint/hadolint/wiki/DL3043)   | Error            | `ONBUILD`, `FROM` or `MAINTAINER` triggered from within `ONBUILD` instruction.                                                                      |
+| [DL3044](https://github.com/hadolint/hadolint/wiki/DL3044)   | Error            | Do not refer to an environment variable within the same `ENV` statement where it is defined.                                                        |
+| [DL3045](https://github.com/hadolint/hadolint/wiki/DL3045)   | Warning          | `COPY` to a relative destination without `WORKDIR` set.                                                                                             |
+| [DL3046](https://github.com/hadolint/hadolint/wiki/DL3046)   | Warning          | `useradd` without flag `-l` and high UID will result in excessively large Image.                                                                    |
+| [DL3047](https://github.com/hadolint/hadolint/wiki/DL3047)   | Info             | `wget` without flag `--progress` will result in excessively bloated build logs when downloading larger files.                                       |
+| [DL3048](https://github.com/hadolint/hadolint/wiki/DL3048)   | Style            | Invalid Label Key                                                                                                                                   |
+| [DL3049](https://github.com/hadolint/hadolint/wiki/DL3049)   | Info             | Label `<label>` is missing.                                                                                                                         |
+| [DL3050](https://github.com/hadolint/hadolint/wiki/DL3050)   | Info             | Superfluous label(s) present.                                                                                                                       |
+| [DL3051](https://github.com/hadolint/hadolint/wiki/DL3051)   | Warning          | Label `<label>` is empty.                                                                                                                           |
+| [DL3052](https://github.com/hadolint/hadolint/wiki/DL3052)   | Warning          | Label `<label>` is not a valid URL.                                                                                                                 |
+| [DL3053](https://github.com/hadolint/hadolint/wiki/DL3053)   | Warning          | Label `<label>` is not a valid time format - must be conform to RFC3339.                                                                            |
+| [DL3054](https://github.com/hadolint/hadolint/wiki/DL3054)   | Warning          | Label `<label>` is not a valid SPDX license identifier.                                                                                             |
+| [DL3055](https://github.com/hadolint/hadolint/wiki/DL3055)   | Warning          | Label `<label>` is not a valid git hash.                                                                                                            |
+| [DL3056](https://github.com/hadolint/hadolint/wiki/DL3056)   | Warning          | Label `<label>` does not conform to semantic versioning.                                                                                            |
+| [DL3057](https://github.com/hadolint/hadolint/wiki/DL3057)   | IgnoreC          | `HEALTHCHECK` instruction missing.                                                                                                                  |
+| [DL3058](https://github.com/hadolint/hadolint/wiki/DL3058)   | Warning          | Label `<label>` is not a valid email format - must be conform to RFC5322.                                                                           |
+| [DL3059](https://github.com/hadolint/hadolint/wiki/DL3059)   | Info             | Multiple consecutive `RUN` instructions. Consider consolidation.                                                                                    |
+| [DL3060](https://github.com/hadolint/hadolint/wiki/DL3060)   | Info             | `yarn cache clean` missing after `yarn install` was run.                                                                                            |
+| [DL4000](https://github.com/hadolint/hadolint/wiki/DL4000)   | Error            | MAINTAINER is deprecated.                                                                                                                           |
+| [DL4001](https://github.com/hadolint/hadolint/wiki/DL4001)   | Warning          | Either use Wget or Curl but not both.                                                                                                               |
+| [DL4003](https://github.com/hadolint/hadolint/wiki/DL4003)   | Warning          | Multiple `CMD` instructions found.                                                                                                                  |
+| [DL4004](https://github.com/hadolint/hadolint/wiki/DL4004)   | Error            | Multiple `ENTRYPOINT` instructions found.                                                                                                           |
+| [DL4005](https://github.com/hadolint/hadolint/wiki/DL4005)   | Warning          | Use `SHELL` to change the default shell.                                                                                                            |
+| [DL4006](https://github.com/hadolint/hadolint/wiki/DL4006)   | Warning          | Set the `SHELL` option -o pipefail before `RUN` with a pipe in it                                                                                   |
+| [SC1000](https://github.com/koalaman/shellcheck/wiki/SC1000) |                  | `$` is not used specially and should therefore be escaped.                                                                                          |
+| [SC1001](https://github.com/koalaman/shellcheck/wiki/SC1001) |                  | This `\c` will be a regular `'c'`  in this context.                                                                                                 |
+| [SC1007](https://github.com/koalaman/shellcheck/wiki/SC1007) |                  | Remove space after `=` if trying to assign a value (or for empty string, use `var='' ...`).                                                         |
+| [SC1010](https://github.com/koalaman/shellcheck/wiki/SC1010) |                  | Use semicolon or linefeed before `done` (or quote to make it literal).                                                                              |
+| [SC1018](https://github.com/koalaman/shellcheck/wiki/SC1018) |                  | This is a unicode non-breaking space. Delete it and retype as space.                                                                                |
+| [SC1035](https://github.com/koalaman/shellcheck/wiki/SC1035) |                  | You need a space here                                                                                                                               |
+| [SC1045](https://github.com/koalaman/shellcheck/wiki/SC1045) |                  | It's not `foo &; bar`, just `foo & bar`.                                                                                                            |
+| [SC1065](https://github.com/koalaman/shellcheck/wiki/SC1065) |                  | Trying to declare parameters? Don't. Use `()` and refer to params as `$1`, `$2` etc.                                                                |
+| [SC1066](https://github.com/koalaman/shellcheck/wiki/SC1066) |                  | Don't use $ on the left side of assignments.                                                                                                        |
+| [SC1068](https://github.com/koalaman/shellcheck/wiki/SC1068) |                  | Don't put spaces around the `=` in assignments.                                                                                                     |
+| [SC1077](https://github.com/koalaman/shellcheck/wiki/SC1077) |                  | For command expansion, the tick should slant left (\` vs ´).                                                                                        |
+| [SC1078](https://github.com/koalaman/shellcheck/wiki/SC1078) |                  | Did you forget to close this double-quoted string?                                                                                                  |
+| [SC1079](https://github.com/koalaman/shellcheck/wiki/SC1079) |                  | This is actually an end quote, but due to next char, it looks suspect.                                                                              |
+| [SC1081](https://github.com/koalaman/shellcheck/wiki/SC1081) |                  | Scripts are case sensitive. Use `if`, not `If`.                                                                                                     |
+| [SC1083](https://github.com/koalaman/shellcheck/wiki/SC1083) |                  | This `{/}` is literal. Check expression (missing `;/\n`?) or quote it.                                                                              |
+| [SC1086](https://github.com/koalaman/shellcheck/wiki/SC1086) |                  | Don't use `$` on the iterator name in for loops.                                                                                                    |
+| [SC1087](https://github.com/koalaman/shellcheck/wiki/SC1087) |                  | Braces are required when expanding arrays, as in `${array[idx]}`.                                                                                   |
+| [SC1095](https://github.com/koalaman/shellcheck/wiki/SC1095) |                  | You need a space or linefeed between the function name and body.                                                                                    |
+| [SC1097](https://github.com/koalaman/shellcheck/wiki/SC1097) |                  | Unexpected `==`. For assignment, use `=`. For comparison, use `[ .. ]` or `[[ .. ]]`.                                                               |
+| [SC1098](https://github.com/koalaman/shellcheck/wiki/SC1098) |                  | Quote/escape special characters when using `eval`, e.g. `eval "a=(b)"`.                                                                             |
+| [SC1099](https://github.com/koalaman/shellcheck/wiki/SC1099) |                  | You need a space before the `#`.                                                                                                                    |
+| [SC2002](https://github.com/koalaman/shellcheck/wiki/SC2002) |                  | Useless cat. Consider <code>cmd < file &#124; ..</code> or <code>cmd file &#124; ..</code> instead.                                                 |
+| [SC2015](https://github.com/koalaman/shellcheck/wiki/SC2015) |                  | Note that <code>A && B &#124;&#124; C</code> is not if-then-else. C may run when A is true.                                                         |
+| [SC2026](https://github.com/koalaman/shellcheck/wiki/SC2026) |                  | This word is outside of quotes. Did you intend to 'nest '"'single quotes'"' instead'?                                                               |
+| [SC2028](https://github.com/koalaman/shellcheck/wiki/SC2028) |                  | `echo` won't expand escape sequences. Consider `printf`.                                                                                            |
+| [SC2035](https://github.com/koalaman/shellcheck/wiki/SC2035) |                  | Use `./*glob*` or `-- *glob*` so names with dashes won't become options.                                                                            |
+| [SC2039](https://github.com/koalaman/shellcheck/wiki/SC2039) |                  | In POSIX sh, something is undefined.                                                                                                                |
+| [SC2046](https://github.com/koalaman/shellcheck/wiki/SC2046) |                  | Quote this to prevent word splitting                                                                                                                |
+| [SC2086](https://github.com/koalaman/shellcheck/wiki/SC2086) |                  | Double quote to prevent globbing and word splitting.                                                                                                |
+| [SC2140](https://github.com/koalaman/shellcheck/wiki/SC2140) |                  | Word is in the form `"A"B"C"` (B indicated). Did you mean `"ABC"` or `"A\"B\"C"`?                                                                   |
+| [SC2154](https://github.com/koalaman/shellcheck/wiki/SC2154) |                  | var is referenced but not assigned.                                                                                                                 |
+| [SC2155](https://github.com/koalaman/shellcheck/wiki/SC2155) |                  | Declare and assign separately to avoid masking return values.                                                                                       |
+| [SC2164](https://github.com/koalaman/shellcheck/wiki/SC2164) |                  | Use <code>cd ... &#124;&#124; exit</code> in case `cd` fails.                                                                                       |
+<!--lint enable maximum-line-length-->
 
 ## Develop
 
@@ -407,8 +515,9 @@
 
 ### AST
 
-Dockerfile syntax is fully described in the [Dockerfile reference][]. Just take
-a look at [Syntax.hs][] in the `language-docker` project to see the AST definition.
+Dockerfile syntax is fully described in the [Dockerfile reference][].
+Just take a look at [Syntax.hs][] in the `language-docker` project to see
+the AST definition.
 
 ## Alternatives
 
diff --git a/hadolint.cabal b/hadolint.cabal
--- a/hadolint.cabal
+++ b/hadolint.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hadolint
-version:        2.6.1
+version:        2.7.0
 synopsis:       Dockerfile Linter JavaScript API
 description:    A smarter Dockerfile linter that helps you build best practice Docker images.
 category:       Development
@@ -60,7 +60,6 @@
       Hadolint.Rule.DL3014
       Hadolint.Rule.DL3015
       Hadolint.Rule.DL3016
-      Hadolint.Rule.DL3017
       Hadolint.Rule.DL3018
       Hadolint.Rule.DL3019
       Hadolint.Rule.DL3020
@@ -74,7 +73,6 @@
       Hadolint.Rule.DL3028
       Hadolint.Rule.DL3029
       Hadolint.Rule.DL3030
-      Hadolint.Rule.DL3031
       Hadolint.Rule.DL3032
       Hadolint.Rule.DL3033
       Hadolint.Rule.DL3034
@@ -82,7 +80,6 @@
       Hadolint.Rule.DL3036
       Hadolint.Rule.DL3037
       Hadolint.Rule.DL3038
-      Hadolint.Rule.DL3039
       Hadolint.Rule.DL3040
       Hadolint.Rule.DL3041
       Hadolint.Rule.DL3042
@@ -144,7 +141,7 @@
     , filepath
     , foldl
     , ilist
-    , language-docker >=10.0.0 && <11
+    , language-docker >=10.1.0 && <11
     , megaparsec >=9.0.0
     , mtl
     , network-uri
@@ -181,7 +178,7 @@
     , containers
     , gitrev >=1.3.1
     , hadolint
-    , language-docker >=10.0.0 && <11
+    , language-docker >=10.1.0 && <11
     , megaparsec >=9.0.0
     , optparse-applicative >=0.14.0
     , text
@@ -211,7 +208,6 @@
       DL3014
       DL3015
       DL3016
-      DL3017
       DL3018
       DL3019
       DL3020
@@ -225,7 +221,6 @@
       DL3028
       DL3029
       DL3030
-      DL3031
       DL3032
       DL3033
       DL3034
@@ -233,7 +228,6 @@
       DL3036
       DL3037
       DL3038
-      DL3039
       DL3040
       DL3041
       DL3042
@@ -290,7 +284,7 @@
     , foldl
     , hadolint
     , hspec
-    , language-docker >=10.0.0 && <11
+    , language-docker >=10.1.0 && <11
     , megaparsec >=9.0.0
     , split >=0.2
     , text
diff --git a/src/Hadolint/Process.hs b/src/Hadolint/Process.hs
--- a/src/Hadolint/Process.hs
+++ b/src/Hadolint/Process.hs
@@ -25,7 +25,6 @@
 import qualified Hadolint.Rule.DL3014
 import qualified Hadolint.Rule.DL3015
 import qualified Hadolint.Rule.DL3016
-import qualified Hadolint.Rule.DL3017
 import qualified Hadolint.Rule.DL3018
 import qualified Hadolint.Rule.DL3019
 import qualified Hadolint.Rule.DL3020
@@ -39,7 +38,6 @@
 import qualified Hadolint.Rule.DL3028
 import qualified Hadolint.Rule.DL3029
 import qualified Hadolint.Rule.DL3030
-import qualified Hadolint.Rule.DL3031
 import qualified Hadolint.Rule.DL3032
 import qualified Hadolint.Rule.DL3033
 import qualified Hadolint.Rule.DL3034
@@ -47,7 +45,6 @@
 import qualified Hadolint.Rule.DL3036
 import qualified Hadolint.Rule.DL3037
 import qualified Hadolint.Rule.DL3038
-import qualified Hadolint.Rule.DL3039
 import qualified Hadolint.Rule.DL3040
 import qualified Hadolint.Rule.DL3041
 import qualified Hadolint.Rule.DL3042
@@ -156,7 +153,6 @@
     <> Hadolint.Rule.DL3014.rule
     <> Hadolint.Rule.DL3015.rule
     <> Hadolint.Rule.DL3016.rule
-    <> Hadolint.Rule.DL3017.rule
     <> Hadolint.Rule.DL3018.rule
     <> Hadolint.Rule.DL3019.rule
     <> Hadolint.Rule.DL3020.rule
@@ -170,7 +166,6 @@
     <> Hadolint.Rule.DL3028.rule
     <> Hadolint.Rule.DL3029.rule
     <> Hadolint.Rule.DL3030.rule
-    <> Hadolint.Rule.DL3031.rule
     <> Hadolint.Rule.DL3032.rule
     <> Hadolint.Rule.DL3033.rule
     <> Hadolint.Rule.DL3034.rule
@@ -178,7 +173,6 @@
     <> Hadolint.Rule.DL3036.rule
     <> Hadolint.Rule.DL3037.rule
     <> Hadolint.Rule.DL3038.rule
-    <> Hadolint.Rule.DL3039.rule
     <> Hadolint.Rule.DL3040.rule
     <> Hadolint.Rule.DL3041.rule
     <> Hadolint.Rule.DL3042.rule
diff --git a/src/Hadolint/Rule.hs b/src/Hadolint/Rule.hs
--- a/src/Hadolint/Rule.hs
+++ b/src/Hadolint/Rule.hs
@@ -195,3 +195,22 @@
   case fromInstr of
     From BaseImage {alias = Just (ImageAlias as)} -> predicate as
     _ -> True
+
+archiveFileFormatExtensions :: [Text.Text]
+archiveFileFormatExtensions =
+  [ ".tar",
+    ".Z",
+    ".bz2",
+    ".gz",
+    ".lz",
+    ".lzma",
+    ".tZ",
+    ".tb2",
+    ".tbz",
+    ".tbz2",
+    ".tgz",
+    ".tlz",
+    ".tpz",
+    ".txz",
+    ".xz"
+  ]
diff --git a/src/Hadolint/Rule/DL3010.hs b/src/Hadolint/Rule/DL3010.hs
--- a/src/Hadolint/Rule/DL3010.hs
+++ b/src/Hadolint/Rule/DL3010.hs
@@ -11,28 +11,11 @@
     code = "DL3010"
     severity = DLInfoC
     message = "Use ADD for extracting archives into an image"
-    check (Copy (CopyArgs srcs _ _ _ _)) =
+    check (Copy (CopyArgs srcs _ _ _ NoSource)) =
       and
         [ not (format `Text.isSuffixOf` src)
           | SourcePath src <- toList srcs,
-            format <- archiveFormats
+            format <- archiveFileFormatExtensions
         ]
     check _ = True
-    archiveFormats =
-      [ ".tar",
-        ".tar.bz2",
-        ".tb2",
-        ".tbz",
-        ".tbz2",
-        ".tar.gz",
-        ".tgz",
-        ".tpz",
-        ".tar.lz",
-        ".tar.lzma",
-        ".tlz",
-        ".tar.xz",
-        ".txz",
-        ".tar.Z",
-        ".tZ"
-      ]
 {-# INLINEABLE rule #-}
diff --git a/src/Hadolint/Rule/DL3017.hs b/src/Hadolint/Rule/DL3017.hs
deleted file mode 100644
--- a/src/Hadolint/Rule/DL3017.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Hadolint.Rule.DL3017 (rule) where
-
-import Hadolint.Rule
-import Hadolint.Shell (ParsedShell)
-import qualified Hadolint.Shell as Shell
-import Language.Docker.Syntax
-
-rule :: Rule ParsedShell
-rule = simpleRule code severity message check
-  where
-    code = "DL3017"
-    severity = DLErrorC
-    message = "Do not use apk upgrade"
-    check (Run (RunArgs args _)) = foldArguments (Shell.noCommands (Shell.cmdHasArgs "apk" ["upgrade"])) args
-    check _ = True
-{-# INLINEABLE rule #-}
diff --git a/src/Hadolint/Rule/DL3020.hs b/src/Hadolint/Rule/DL3020.hs
--- a/src/Hadolint/Rule/DL3020.hs
+++ b/src/Hadolint/Rule/DL3020.hs
@@ -21,23 +21,7 @@
 isArchive path =
   or
     ( [ ftype `Text.isSuffixOf` path
-        | ftype <-
-            [ ".tar",
-              ".gz",
-              ".bz2",
-              ".xz",
-              ".zip",
-              ".tgz",
-              ".tb2",
-              ".tbz",
-              ".tbz2",
-              ".lz",
-              ".lzma",
-              ".tlz",
-              ".txz",
-              ".Z",
-              ".tZ"
-            ]
+        | ftype <- archiveFileFormatExtensions
       ]
     )
 
diff --git a/src/Hadolint/Rule/DL3031.hs b/src/Hadolint/Rule/DL3031.hs
deleted file mode 100644
--- a/src/Hadolint/Rule/DL3031.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-module Hadolint.Rule.DL3031 (rule) where
-
-import Hadolint.Rule
-import qualified Hadolint.Shell as Shell
-import Language.Docker.Syntax
-
-rule :: Rule Shell.ParsedShell
-rule = simpleRule code severity message check
-  where
-    code = "DL3031"
-    severity = DLErrorC
-    message = "Do not use yum update."
-    check (Run (RunArgs args _)) =
-      foldArguments
-        ( Shell.noCommands
-            ( Shell.cmdHasArgs
-                "yum"
-                [ "update",
-                  "update-to",
-                  "upgrade",
-                  "upgrade-to"
-                ]
-            )
-        )
-        args
-    check _ = True
-{-# INLINEABLE rule #-}
diff --git a/src/Hadolint/Rule/DL3035.hs b/src/Hadolint/Rule/DL3035.hs
--- a/src/Hadolint/Rule/DL3035.hs
+++ b/src/Hadolint/Rule/DL3035.hs
@@ -9,16 +9,14 @@
   where
     code = "DL3035"
     severity = DLWarningC
-    message = "Do not use `zypper update`."
+    message = "Do not use `zypper dist-upgrade`."
 
     check (Run (RunArgs args _)) =
       foldArguments
         ( Shell.noCommands
             ( Shell.cmdHasArgs
                 "zypper"
-                [ "update",
-                  "up",
-                  "dist-upgrade",
+                [ "dist-upgrade",
                   "dup"
                 ]
             )
diff --git a/src/Hadolint/Rule/DL3039.hs b/src/Hadolint/Rule/DL3039.hs
deleted file mode 100644
--- a/src/Hadolint/Rule/DL3039.hs
+++ /dev/null
@@ -1,26 +0,0 @@
-module Hadolint.Rule.DL3039 (rule) where
-
-import Hadolint.Rule
-import qualified Hadolint.Shell as Shell
-import Language.Docker.Syntax
-
-rule :: Rule Shell.ParsedShell
-rule = simpleRule code severity message check
-  where
-    code = "DL3039"
-    severity = DLErrorC
-    message = "Do not use dnf update."
-
-    check (Run (RunArgs args _)) =
-      foldArguments
-        ( Shell.noCommands
-            ( Shell.cmdHasArgs
-                "dnf"
-                [ "upgrade",
-                  "upgrade-minimal"
-                ]
-            )
-        )
-        args
-    check _ = True
-{-# INLINEABLE rule #-}
diff --git a/src/Hadolint/Shell.hs b/src/Hadolint/Shell.hs
--- a/src/Hadolint/Shell.hs
+++ b/src/Hadolint/Shell.hs
@@ -61,7 +61,7 @@
 
 shellcheck :: ShellOpts -> ParsedShell -> [PositionedComment]
 shellcheck (ShellOpts sh env) (ParsedShell txt _ _) =
-  if any (`Text.isPrefixOf` sh) nonPosixShells
+  if any (`Text.isPrefixOf` sh) nonPosixShells || hasUnsupportedShebang txt
     then [] -- Do no run for non-posix shells i.e. powershell, cmd.exe
     else runShellCheck
   where
@@ -87,6 +87,19 @@
 
 nonPosixShells :: [Text.Text]
 nonPosixShells = ["pwsh", "powershell", "cmd"]
+
+hasUnsupportedShebang :: Text.Text -> Bool
+hasUnsupportedShebang script =
+  "#!" `Text.isPrefixOf` script &&
+  not ( any (`Text.isPrefixOf` script)
+          [ "#!/bin/sh",
+            "#!/bin/bash",
+            "#!/bin/ksh",
+            "#!/usr/bin/env sh",
+            "#!/usr/bin/env bash",
+            "#!/usr/bin/env ksh"
+          ]
+      )
 
 parseShell :: Text.Text -> ParsedShell
 parseShell txt = ParsedShell {original = txt, parsed = parsedResult, presentCommands = commands}
diff --git a/test/DL3010.hs b/test/DL3010.hs
--- a/test/DL3010.hs
+++ b/test/DL3010.hs
@@ -10,3 +10,4 @@
   describe "COPY rules" $ do
     it "use add" $ ruleCatches "DL3010" "COPY packaged-app.tar /usr/src/app"
     it "use not add" $ ruleCatchesNot "DL3010" "COPY package.json /usr/src/app"
+    it "ignore: copy from previous stage" $ ruleCatchesNot "DL3010" "COPY --from=builder /usr/local/share/some.tar /opt/some.tar"
diff --git a/test/DL3017.hs b/test/DL3017.hs
deleted file mode 100644
--- a/test/DL3017.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module DL3017 (tests) where
-
-import Helpers
-import Test.Hspec
-
-
-tests :: SpecWith ()
-tests = do
-  let ?rulesConfig = mempty
-  describe "DL3017 - Do not use `apk upgrade`." $ do
-    it "apk upgrade" $ do
-      ruleCatches "DL3017" "RUN apk update && apk upgrade"
-      onBuildRuleCatches "DL3017" "RUN apk update && apk upgrade"
diff --git a/test/DL3020.hs b/test/DL3020.hs
--- a/test/DL3020.hs
+++ b/test/DL3020.hs
@@ -9,10 +9,10 @@
   let ?rulesConfig = mempty
   describe "DL3020 - Use `COPY` instead of `ADD` for files and folders." $ do
     it "add for tar" $ ruleCatchesNot "DL3020" "ADD file.tar /usr/src/app/"
-    it "add for zip" $ ruleCatchesNot "DL3020" "ADD file.zip /usr/src/app/"
     it "add for gzip" $ ruleCatchesNot "DL3020" "ADD file.gz /usr/src/app/"
     it "add for bz2" $ ruleCatchesNot "DL3020" "ADD file.bz2 /usr/src/app/"
     it "add for xz" $ ruleCatchesNot "DL3020" "ADD file.xz /usr/src/app/"
     it "add for tgz" $ ruleCatchesNot "DL3020" "ADD file.tgz /usr/src/app/"
     it "add for url" $ ruleCatchesNot "DL3020" "ADD http://file.com /usr/src/app/"
     it "using add" $ ruleCatches "DL3020" "ADD file /usr/src/app/"
+    it "warn for zip" $ ruleCatches "DL3020" "ADD file.zip /usr/src/app/"
diff --git a/test/DL3031.hs b/test/DL3031.hs
deleted file mode 100644
--- a/test/DL3031.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-module DL3031 (tests) where
-
-import Helpers
-import Test.Hspec
-
-
-tests :: SpecWith ()
-tests = do
-  let ?rulesConfig = mempty
-  describe "DL3031" $ do
-    it "yum update" $ do
-      ruleCatches "DL3031" "RUN yum update"
-      onBuildRuleCatches "DL3031" "RUN yum update"
-    it "not yum update" $ do
-      ruleCatchesNot "DL3031" "RUN yum install -y httpd-2.4.42 && yum clean all"
-      ruleCatchesNot "DL3031" "RUN bash -c `# not even a yum command`"
-      onBuildRuleCatchesNot "DL3031" "RUN yum install -y httpd-2.4.42 && yum clean all"
-      onBuildRuleCatchesNot "DL3031" "RUN bash -c `# not even a yum command`"
diff --git a/test/DL3035.hs b/test/DL3035.hs
--- a/test/DL3035.hs
+++ b/test/DL3035.hs
@@ -8,11 +8,6 @@
 tests = do
   let ?rulesConfig = mempty
   describe "DL3035" $ do
-    it "not ok: zypper update" $ do
-      ruleCatches "DL3035" "RUN zypper update"
-      ruleCatches "DL3035" "RUN zypper up"
-      onBuildRuleCatches "DL3035" "RUN zypper update"
-      onBuildRuleCatches "DL3035" "RUN zypper up"
     it "not ok: zypper dist-upgrade" $ do
       ruleCatches "DL3035" "RUN zypper dist-upgrade"
       ruleCatches "DL3035" "RUN zypper dup"
diff --git a/test/DL3039.hs b/test/DL3039.hs
deleted file mode 100644
--- a/test/DL3039.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-module DL3039 (tests) where
-
-import Helpers
-import Test.Hspec
-
-
-tests :: SpecWith ()
-tests = do
-  let ?rulesConfig = mempty
-  describe "DL3039" $ do
-    it "dnf update" $ do
-      ruleCatches "DL3039" "RUN dnf upgrade"
-      ruleCatches "DL3039" "RUN dnf upgrade-minimal"
-      onBuildRuleCatches "DL3039" "RUN dnf upgrade"
-      onBuildRuleCatches "DL3039" "RUN dnf upgrade-minimal"
-    it "not dnf upgrade" $ do
-      ruleCatchesNot "DL3039" "RUN notdnf upgrade"
-      onBuildRuleCatchesNot "DL3039" "RUN notdnf upgrade"
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -17,7 +17,6 @@
 import qualified DL3014
 import qualified DL3015
 import qualified DL3016
-import qualified DL3017
 import qualified DL3018
 import qualified DL3019
 import qualified DL3020
@@ -31,7 +30,6 @@
 import qualified DL3028
 import qualified DL3029
 import qualified DL3030
-import qualified DL3031
 import qualified DL3032
 import qualified DL3033
 import qualified DL3034
@@ -39,7 +37,6 @@
 import qualified DL3036
 import qualified DL3037
 import qualified DL3038
-import qualified DL3039
 import qualified DL3040
 import qualified DL3041
 import qualified DL3042
@@ -188,7 +185,6 @@
     DL3014.tests
     DL3015.tests
     DL3016.tests
-    DL3017.tests
     DL3018.tests
     DL3019.tests
     DL3020.tests
@@ -202,7 +198,6 @@
     DL3028.tests
     DL3029.tests
     DL3030.tests
-    DL3031.tests
     DL3032.tests
     DL3033.tests
     DL3034.tests
@@ -210,7 +205,6 @@
     DL3036.tests
     DL3037.tests
     DL3038.tests
-    DL3039.tests
     DL3040.tests
     DL3041.tests
     DL3042.tests
