【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)
相关推荐
互联网搬砖老肖2 分钟前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
Antonio91526 分钟前
【音视频】HLS简介与服务器搭建
运维·服务器·音视频
艾伦_耶格宇2 小时前
【docker】-1 docker简介
运维·docker·容器
R.X. NLOS2 小时前
VS Code远程开发新方案:使用SFTP扩展解决Remote-SSH连接不稳定问题
运维·服务器·ssh·debug·vs code
cuijiecheng20182 小时前
Ubuntu下布署mediasoup-demo
linux·运维·ubuntu
IvanCodes3 小时前
二、Docker安装部署教程
docker·容器
Andy杨5 小时前
20250707-4-Kubernetes 集群部署、配置和验证-K8s基本资源概念初_笔记
笔记·容器·kubernetes
jingyu飞鸟6 小时前
linux系统源代码安装apache、编译隐藏版本号
linux·运维·apache
2401_858286117 小时前
OS15.【Linux】gdb调试器的简单使用
linux·运维·服务器·开发语言·gdb
容器魔方8 小时前
中选名单出炉|18位学生入选开源之夏KubeEdge课题,欢迎加入!
云原生·容器·云计算