【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)
相关推荐
零基础1233 分钟前
LLM Agent 驱动的物模型构建:从设备手册到边缘接入的自动化实践
运维·人工智能·经验分享·python·自动化
更深兼春远1 小时前
第2篇:Dify 部署保姆级教程:用 Docker跑起来
docker·容器·dify
程序猿老A1 小时前
从入门型到企业型:云服务器开放共享型到独享型规格升级
运维·服务器
Ruiery2 小时前
Linux 6.6内核 CPU 深度解析(九):时钟与 TSC — 内核怎么从 PIT/HPET 切到 TSC
linux·运维·服务器
吴声子夜歌3 小时前
Nginx应用与运维——Nginx日志管理
java·运维·nginx
打工仔折腾 AI3 小时前
用UU远程把家里电脑变成AI Agent常驻服务器:CLI、端口映射与代理实测
运维·服务器·人工智能·后端·python·电脑·ai agent 实战
guo_wen_qiang3 小时前
云服务器nacos搭建-集群&持久化
java·运维·服务器
牢姐与蒯3 小时前
一点小碎片——每个线程独有的东西——上下文+栈
linux·运维·服务器
Elastic 中国社区官方博客4 小时前
错误最多的服务运行正常:使用 ES|QL 从日志进行根因分析
大数据·运维·数据库·sql·elasticsearch·搜索引擎·全文检索
迪康coolmu4 小时前
屏幕水印与防拍照落地:从水印类型到泄密溯源的完整配置
运维·网络·安全·网络安全·数据安全