例如,如果编写的Dockerfile错误,则:CMD ["service", "--config", "/etc/service.conf]
(缺少引号)
有没有办法使它掉毛以便在构建之前检测出此类错误?
最佳答案
尝试:
hadolint
将Dockerfile解析为AST,并基于best practice Docker images rules执行检查和验证。它还使用Shellcheck在RUN
命令上添加了Bash代码。 我已经使用
RUN
,ADD
,ENV
和CMD
对一个简单的Docker文件执行了一个简单的测试。 dockerlinter
在将相同的违反规则分组在一起方面很聪明,但是由于缺少用于静态分析Bash代码的hadolinter
,它无法像Shellcheck
一样进行彻底的检查。尽管
dockerlinter
可能会影响范围,但似乎确实更易于安装。 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。关于docker - 有没有办法抹平Dockerfile?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48498846/