如果 Dockerfile 写入错误,例如:
CMD ["service", "--config", "/etc/service.conf]
(缺少报价)
有没有办法在构建之前对其进行检查以检测此类错误?
如果 Dockerfile 写入错误,例如:
CMD ["service", "--config", "/etc/service.conf]
(缺少报价)
有没有办法在构建之前对其进行检查以检测此类错误?
尝试:
hadolint
将 Dockerfile 解析为 AST 并根据最佳实践 Docker 映像规则执行检查和验证。它还使用Shellcheck对RUN
命令中的 Bash 代码进行 lint。我使用 、 和 对一个简单的 Docker 文件进行了RUN
简单ADD
的ENV
测试CMD
。很聪明地将相同的违反规则分组在一起,但由于缺乏对Bash 代码的静态分析,dockerlinter
它无法进行尽可能彻底的检查。hadolinter
Shellcheck
尽管dockerlinter
它的 lint 范围不足,但它似乎确实更容易安装。npm install -g dockerlinter
会做,而编译hadolinter
需要一个 Haskell 编译器和构建环境,需要永远编译。
$ hadolint ./api/Dockerfile
L9 SC2046 Quote this to prevent word splitting.
L11 SC2046 Quote this to prevent word splitting.
L8 DL3020 Use COPY instead of ADD for files and folders
L10 DL3020 Use COPY instead of ADD for files and folders
L13 DL3020 Use COPY instead of ADD for files and folders
L18 DL3020 Use COPY instead of ADD for files and folders
L21 DL3020 Use COPY instead of ADD for files and folders
L6 DL3008 Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
L6 DL3009 Delete the apt-get lists after installing something
L6 DL3015 Avoid additional packages by specifying `--no-install-recommends`
$ dockerlint ./api/Dockerfile
WARN: ADD instruction used instead of COPY on line 8, 10, 13, 18, 21
ERROR: ./api/Dockerfile failed.
2018 年更新。由于hadolint
现在有官方的 Docker 存储库,您可以快速获取可执行文件:
id=$(docker create hadolint/hadolint:latest)
docker cp "$id":/bin/hadolint .
docker rm "$id"
或者你可以使用这个命令
docker container run --rm -i hadolint/hadolint hadolint - < Dockerfile
这是一个静态编译的可执行文件(根据ldd hadolint
),因此无论安装的库如何,它都应该运行。关于如何构建可执行文件的参考:https ://github.com/hadolint/hadolint/blob/master/docker/Dockerfile 。
如果您订阅了 RedHat,您可以直接在https://access.redhat.com/labs/linterfordockerfile/访问“Linter for Dockerfile”应用程序;有关应用程序的信息位于https://access.redhat.com/labsinfo/linterfordockerfile
如果您希望在本地运行此 Node.js 应用程序,也可以在 GitHub https://github.com/redhataccess/dockerfile_lint上找到它。
我在 CI 管道 npm 的dockerfile_lint中使用非常成功。您可以添加或扩展规则。使用package.json
您可以为不同的作业创建不同的配置。两者都有
码头工人 CLI
docker run -it --rm --privileged -v `pwd`:/root/ \
projectatomic/dockerfile-lint \
dockerfile_lint [-f Dockerfile]
docker run -it --rm --privileged -v `pwd`:/root/ \
-v /var/run/docker.sock:/var/run/docker.sock \
projectatomic/dockerfile-lint \
dockerfile_lint image <imageid>
和可用的原子 CLI
atomic run projectatomic/dockerfile-lint
atomic run projectatomic/dockerfile-lint image <imageid>
您还可以对图像进行 lint 标记以进行标记。
我创建了dockerfile-validator作为 VS Code 的扩展,它使用了上一个答案中提到的dockerfile-lint 。默认情况下,它使用 dockerfile-lint 默认规则,但在 VS 代码用户设置 (dockerfile-validator.rulefile.path) 中,您可以使用自己的编码标准指定自定义规则文件的路径。
Recently, I cam across dockerfilelint which is NodeJS based.
dockerfilelint Dockerfile
Supports following rules and rudimentary CMD checks
required_params
uppercase_commands
from_first
invalid_line
sudo_usage
apt-get_missing_param
apt-get_recommends
apt-get-upgrade
apt-get-dist-upgrade
apt-get-update_require_install
apkadd-missing_nocache_or_updaterm
apkadd-missing-virtual
invalid_port
invalid_command
expose_host_port
label_invalid
missing_tag
latest_tag
extra_args
missing_args
add_src_invalid
add_dest_invalid
invalid_workdir
invalid_format
apt-get_missing_rm
deprecated_in_1.13
Hadolint seems like a better option but this may suffice for simple needs. Also, Github's super-linter uses this.