Hadolint是一个很棒的检查Dockerfiles的工具。我在努力集成到我的CI,但我正在处理运行在多个Dockerfiles。有人知道语法是怎样的吗?下面是我的目录显示:
dir1/Dockerfile
dir2/Dockerfile
dir3/foo/Dockerfile
在gitlab-ci
stage: hadolint
image: hadolint/hadolint:latest-debian
script:
- mkdir -p reports
- |
hadolint dir1/Dockerfile > reports/dir1.json
hadolint dir2/Dockerfile > reports/dir2.json
hadolint dir3/foo/Dockerfile > reports/dir3.json
但是上面的示例现在可以工作了。
就我所知,hadolint
是递归运行的。在我的例子中:
- hadolint */Dockerfile > reports/all_reports.json
但是这种方法的问题是,所有的报告将在一个文件中,这妨碍了维护和清晰度
如果您希望将所有报告分开(每个顶级目录一个),您可能希望依赖于一些shell代码片段?
我的意思是:
- |
find . -name Dockerfile -exec
sh -c 'src=${1#./} && { set -x && hadolint "$1"; } | tee -a "reports/${src%%/*}.txt"' sh "{}" ;
解释:
find . -name Dockerfile
遍历当前目录下的所有dockerfile;-exec sh -c '…'
为每个Dockerfile运行子shell,设置如下:$0 = "sh"
(虚拟值)$1 = "{}"
(Dockerfile的完整相对路径),"{}"
和;
与find … -exec
模式直接相关;
src=${1#./}
修剪路径,用dir1/Dockerfile
代替./dir1/Dockerfile
${src%%/*}
提取顶级目录名称(dir1/Dockerfile
→dir1
)- 和
| tee -a …
复制输出,将hadolint
的输出附加到每个解析的Dockerfile的顶层目录报告文件中(而> …
在这里应该避免,因为明显的原因,如果你在一个顶层目录中有几个Dockerfile)。 - 我已经用
.txt
代替了.json
扩展,因为hadolint
似乎不输出JSON数据。