例如,如果编写的Dockerfile错误,则:
CMD ["service", "--config", "/etc/service.conf](缺少引号)

有没有办法使它掉毛以便在构建之前检测出此类错误?

最佳答案

尝试:

  • 要么Haskell Dockerfile Linter ("hadolint"),要么也available onlinehadolint将Dockerfile解析为AST,并基于best practice Docker images rules执行检查和验证。它还使用ShellcheckRUN命令上添加了Bash代码。
  • dockerlinter(基于node.js)。

  • 我已经使用RUNADDENVCMD对一个简单的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/

    10-16 23:51