有没有办法将hadolint用于多个DockerFile?

有没有办法将hadolint用于多个DockerFile?,docker,shell,gitlab,Docker,Shell,Gitlab,这是一个非常棒的工具,用于制作码头文件。我正在努力 集成到我的CI,但我正在处理多个DockerFile的运行。有人知道语法是什么样的吗?以下是我的目录的显示方式: dir1/Dockerfile dir2/Dockerfile dir3/foo/Dockerfile 在gitlab ci中 stage: hadolint image: hadolint/hadolint:latest-debian script: - mkdir -p reports - | had

这是一个非常棒的工具,用于制作码头文件。我正在努力 集成到我的CI,但我正在处理多个DockerFile的运行。有人知道语法是什么样的吗?以下是我的目录的显示方式:

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代码段

我的意思是:

-|
找到-名称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
    → <代码>目录1
  • |tee-a…
    复制输出,将
    hadolint
    的输出附加到顶级目录报告文件中,用于每个解析的Dockerfile(而
    由于明显的原因,如果在一个顶级目录中有多个Dockerfile,则此处应避免使用)
  • 我已经用
    .txt
    替换了
    .json
    扩展名,因为
    hadolint
    似乎没有输出json数据

顺便说一句,如果删除尾随的“\”并修复缩进,应该可以。但是,如果您不想硬编码目录的名称并确保默认情况下对所有Dockerfile进行分析,请参阅我刚才建议的答案。您的建议是一个更通用的解决方案,我已根据需要进行了更改和扩展。接受您的解决方案。顺便说一句,如果您想在日志中获得更多反馈,您可能需要在bash代码段中添加一些
set-x
..&&set-x&&hadolint“$1”..
@ErikMD有趣的是,gitlab ci bash不能作为linux shell工作。我不知道为什么。在终端上运行的命令在CIOK@full_steak_developer中不起作用,这看起来像是一个标准问题,可以通过多种方式解决;我将尝试在我的答案中提供更多细节(希望明天周五!)