如果Dockerfile写错了,例如:
CMD ["service", "--config", "/etc/service.conf]
(缺少引用)
有没有办法在构建前用它来检测这样的错误?
答案 0 :(得分:11)
尝试:
hadolint
将Dockerfile解析为AST,并根据best practice Docker images rules执行检查和验证。它还使用Shellcheck来对RUN
命令上的Bash代码进行lint。我针对包含RUN
,ADD
,ENV
和CMD
的简单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)