【Docker】Dockerfile 优化工具 hadolint

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【Linux】全面讲解 Shell 变量的那些事


目录

一、背景介绍

[二、hadolint 介绍](#二、hadolint 介绍)

[三、hadolint 使用](#三、hadolint 使用)

1、在线检查方式

2、二进制检查方式

[3、Docker 检查方式](#3、Docker 检查方式)

[四、hadolint 命令行选项](#四、hadolint 命令行选项)


一、背景介绍

笔者在《专题三:Dockerfile 相关》《Dockerfile 指令对 Docker 镜像层数的影响》等文章中已经介绍过 Dockerfile 相关知识及其运用。但是在实际工作中 Dockerfile 肯定不是随便写写就行了,而是推荐遵照最佳实践原则对其进行优化,以期达到减少镜像体积、提升构建效率及容器安全性等目标。

工欲善其事,必先利其器。本文将针对 Dockerfile 的优化介绍一款辅助工具,帮助大家提升工作效率。


二、hadolint 介绍

hadolint 是一款专门用于检查 Dockerfile 语法的静态分析工具,可以帮助使用者构建符合最佳实践的 Docker 镜像。

hadolint 作为一个智能的 Dockerfile 筛选器,主要工作流程如下:

  • hadolint 将 Dockerfile 解析为 AST(抽象语法树),以标识与其关联的每条指令和参数

  • hadolint 根据内置的语法规则,在 AST 之上检查每条指令和参数。这些语法规则涵盖了效率、代码质量、安全性等多个方面。此外,hadolint 还使用了著名的 Shellcheck 来检查 RUN 指令中的 Bash 代码

  • Hadolint 会标记所有不符合语法规则的指令和参数,并提供针对性的优化建议

GitHub 地址:https://github.com/hadolint/hadolint

Dockerfile 最佳实践:https://docs.docker.com/build/building/best-practices/


三、hadolint 使用
1、在线检查方式

网址:https://hadolint.github.io/hadolint/

bash 复制代码
# Dockerfile 示例
FROM debian

RUN apt update && apt install -y supervisor
COPY supervisord.conf /etc/supervisor/conf.d/

EXPOSE 80000
CMD ["/usr/bin/supervisord"]

将以上 Dockerfile 内容粘贴至文本框后点击 Lint 按钮,高亮部分即为 hadolint 针对语法检查结果反馈的优化建议,并可点击跳转至详情页。

2、二进制检查方式
  • 安装命令
bash 复制代码
wget -O hadolint https://github.com/hadolint/hadolint/releases/download/v2.12.0/hadolint-Linux-x86_64
chmod +x hadolint && mv hadolint /usr/local/bin
hadolint -v
  • 检查命令
bash 复制代码
hadolint Dockerfile
  • 检查命令(忽略指定规则)
bash 复制代码
hadolint Dockerfile --ignore DL3006 --ignore DL3027
3、Docker 检查方式
复制代码
docker run --rm -i ghcr.io/hadolint/hadolint < Dockerfile

四、hadolint 命令行选项
bash 复制代码
# hadolint -h
hadolint - Dockerfile Linter written in Haskell

Usage: hadolint [-v|--version] [-c|--config FILENAME] [DOCKERFILE...] 
                [--file-path-in-report FILEPATHINREPORT] [--no-fail] 
                [--no-color] [-V|--verbose] [-f|--format ARG] [--error RULECODE]
                [--warning RULECODE] [--info RULECODE] [--style RULECODE] 
                [--ignore RULECODE] 
                [--trusted-registry REGISTRY (e.g. docker.io)] 
                [--require-label LABELSCHEMA (e.g. maintainer:text)] 
                [--strict-labels] [--disable-ignore-pragma] 
                [-t|--failure-threshold THRESHOLD]

  Lint Dockerfile for errors and best practices

Available options:
  -h,--help                Show this help text
  -v,--version             Show version
  -c,--config FILENAME     Path to the configuration file
  --file-path-in-report FILEPATHINREPORT
                           The file path referenced in the generated report.
                           This only applies for the 'checkstyle' format and is
                           useful when running Hadolint with Docker to set the
                           correct file path.
  --no-fail                Don't exit with a failure status code when any rule
                           is violated
  --no-color               Don't colorize output
  -V,--verbose             Enables verbose logging of hadolint's output to
                           stderr
  -f,--format ARG          The output format for the results [tty | json |
                           checkstyle | codeclimate | gitlab_codeclimate | gnu |
                           codacy | sonarqube | sarif] (default: tty)
  --error RULECODE         Make the rule `RULECODE` have the level `error`
  --warning RULECODE       Make the rule `RULECODE` have the level `warning`
  --info RULECODE          Make the rule `RULECODE` have the level `info`
  --style RULECODE         Make the rule `RULECODE` have the level `style`
  --ignore RULECODE        A rule to ignore. If present, the ignore list in the
                           config file is ignored
  --trusted-registry REGISTRY (e.g. docker.io)
                           A docker registry to allow to appear in FROM
                           instructions
  --require-label LABELSCHEMA (e.g. maintainer:text)
                           The option --require-label=label:format makes
                           Hadolint check that the label `label` conforms to
                           format requirement `format`
  --strict-labels          Do not permit labels other than specified in
                           `label-schema`
  --disable-ignore-pragma  Disable inline ignore pragmas `# hadolint
                           ignore=DLxxxx`
  -t,--failure-threshold THRESHOLD
                           Exit with failure code only when rules with a
                           severity equal to or above THRESHOLD are violated.
                           Accepted values: [error | warning | info | style |
                           ignore | none] (default: info)
相关推荐
Mr. Cao code21 分钟前
Docker:颠覆传统虚拟化的轻量级革命
linux·运维·ubuntu·docker·容器
Dontla26 分钟前
Docker多共享网络配置策略(Docker多网络、Docker networks、Docker Compose网络、Docker网络、Docker共享网络)
网络·docker·容器
wanhengidc1 小时前
云手机运行流畅,秒开不卡顿
运维·网络·科技·游戏·智能手机
Jayin_chan1 小时前
paddlex3.0.1-ocr服务化安装部署(docker)
docker·容器·ocr
ifanatic2 小时前
[每周一更]-(第159期):Go 工程师视角:容器化技术(Docker/Kubernetes)与CI/CD流程的应用场景
docker·golang·kubernetes
笨小孩@GF 知行合一2 小时前
OSPF实验:外部路由引入
运维·网络·hcip·数通·ospf
asdfg12589632 小时前
为什么要在出口路由器router配置NAT与默认路由
运维·网络·计算机网络
bug攻城狮3 小时前
Skopeo 工具介绍与 CentOS 7 安装指南
linux·运维·centos
宇宙第一小趴菜3 小时前
08 修改自己的Centos的软件源
linux·运维·centos
bug攻城狮3 小时前
彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声
linux·运维·服务器·centos·vim