有没有办法lint Dockerfile?

时间:2015-01-27 23:36:20

标签: docker dockerfile

如果Dockerfile写错了,例如:

CMD ["service", "--config", "/etc/service.conf](缺少引用)

有没有办法在构建前用它来检测这样的错误?

6 个答案:

答案 0 :(得分:11)

尝试:

我针对包含RUNADDENVCMD的简单Docker文件执行了简单测试。 dockerlinter明智地将相同的规则违规归为一类,但由于缺少hadolinter来静态分析Bash代码,因此无法像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"

这是一个静态编译的可执行文件(根据ldd hadolint),因此无论安装的库如何,它都应该运行。关于如何构建可执行文件的参考:https://github.com/hadolint/hadolint/blob/master/docker/Dockerfile

答案 1 :(得分:2)

如果您有RedHat订阅,则可以访问&#34; Linter for Dockerfile&#34;直接申请https://access.redhat.com/labs/linterfordockerfile/;有关该应用程序的信息位于https://access.redhat.com/labsinfo/linterfordockerfile

如果你想在本地运行它,这个Node.js应用程序也可以在GitHub https://github.com/redhataccess/dockerfile_lint上使用。

答案 2 :(得分:0)

我在CI管道中使用非常成功npm&#39; s dockerfile_lint。您可以添加或扩展规则。使用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> ,您可以为不同的作业创建不同的配置。

Docker CLI

 atomic run projectatomic/dockerfile-lint

 atomic run projectatomic/dockerfile-lint image <imageid>

和Atomic CLI可用

{{1}}

此外,您还可以为图片添加图片。

答案 3 :(得分:0)

我创建了dockerfile-validator作为VS Code的扩展,它使用前一个答案中提到的dockerfile-lint。默认情况下,它使用dockerfile-lint默认规则,但在VS代码用户设置(dockerfile-validator.rulefile.path)中,您可以使用自己的编码标准指定自定义规则文件的路径。

答案 4 :(得分:0)

最近,我浏览了基于NodeJS的dockerfilelint

class MockSysCallAgent : public SysCallAgent { MOCK_METHOD0(system_call1, void()); MOCK_METHOD1(system_call2, void()); .... } TEST(test, test) { SysCallAgent::reset(std::move(std::unique_ptr<MockSysCallAgent>())); } ...

支持以下规则和基本CMD checks

dockerfilelint Dockerfile

哈多林特(Hadolint)似乎是一个更好的选择,但这可能满足简单的需求。此外,Github的super-linter也会使用它。

答案 5 :(得分:-1)

我对go不太熟悉,但看起来您可以像在测试套件Parse中那样简单地调用here方法。如果那不会返回错误那么你的lint就会通过。我假设在开发过程中暴露给脚本或其他东西是微不足道的。