Hadolint:Lint Dockerfile 的完整指南

想学习如何使用 Hadolint 对 Dockerfile 进行 lint 处理吗?这篇博文将向您展示如何操作。这是关于 Dockerfile linting 的完整指南。

通过对 Dockerfile 进行 lint 检查,您可以及早发现错误和问题,并确保它们遵循最佳实践。

什么是Hadolint?

Hadolint 是一个使用 Haskell 构建的开源命令行 Dockerfile linter 工具,可帮助您编写无错误的 Dockersfile。Hadolint 会检查您的 Dockerfile 是否存在可能的错误、安全漏洞和性能问题。它在 GitHub 上有超过 9k 的启动

这是它的工作原理。

  1. Hadolint 读取 Dockerfile
  2. 它将 Dockerfile 解析为 AST(抽象语法树),以标识与其关联的每个指令和参数。
  3. 然后,它根据预定义的规则集检查每条指令,这些规则涵盖安全性、效率和代码质量。这些规则是 Hadolint 源代码的一部分。您可以在此处查看规则列表。
  4. Hadolint 会标记所有违反规则的行为,并会针对所有检测到的问题创建反馈。

问题的严重性分类如下:

  1. Info– 您将获得有关信息改进的建议。它被认为不太严重。
  2. Style – 与 Dockerfile 的格式或结构相关,例如使用缩进或使用长单行等。
  3. Warning – 不太严重的问题和需要改进的次要安全问题。
  4. Error– 这些问题很严重,可能与安全漏洞或重大最佳实践违规有关。

现在我们已经对 Hadolint 有了基本的了解,让我们继续安装并查看它的实际效果。

安装 Hadolint

您可以在 Linux、Mac 和 Windows 系统上安装 Hadolint。

在 Linux 中安装

如果要在Linux系统中安装Hadolint,请按照以下步骤操作。

步骤1:从 Hadolint Github 发布页面下载最新的 Linux Hadolint 包。

wget -O hadolint https://github.com/hadolint/hadolint/releases/download/v2.12.0/hadolint-Linux-x86_64

步骤2: 下载应用程序后,将其移动到 /usr/local/bin 目录。

sudo mv hadolint /usr/local/bin/hadolint

第 3 步:使用下面给出的命令向 Hadolint 授予执行权限。

sudo chmod +x /usr/local/bin/hadolint

在 Mac 中安装

您可以使用下面给出的命令在 Mac 系统上安装 Hadolint。

brew install hadolint

要检查 Linux 或 Mac 系统上是否安装了 Hadolint,请运行以下命令:

hadolint --version

在 Windows 中安装

使用 scoop 在 Windows 上安装 Hadolint

scoop install hadolint

安装 hadolint 后,您将拥有 hadolint CLI 来对 Dockerfile 运行 lint 测试。

要了解所有 CLI 选项,可以使用 –help 标志。

hadolint --help

使用 Hadolint 的 lint Dockerfile

要使用 Hadolint,只需将其安装在您的系统上并使用 Dockerfile 运行该命令。Hadolint 将提供它在 Dockerfile 中发现的错误列表作为输出,以及严重性级别和该问题的原因。

为了获得实际的理解,我们将使用未优化的 Dockerfile。

将以下内容另存为 Dockerfile

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get update && apt-get install -y curl
RUN echo "hello world" | grep "world" | wc -l
CMD ["echo", "Hello, world!"]

让我们针对上面的 Dockerfile 运行 Hadolint。确保 Dockerfile 位于运行 hadolint 命令的同一目录中。

hadolint Dockerfile

您将收到以下输出,其中包含“警告”和信息”消息,其中包含规则编号和修正信息,如下图所示。

如果您检查编号 7,Hadolint 也会提供有关 shell 脚本的信息。Hadolint 在后台使用 Shellcheck 对属于 RUN 指令一部分的 shell 脚本进行 lint 处理。

现在,如果您检查退出代码,您将获得一个非零返回。

hadolint-examples git:(main) ✗ echo $?                      
1
➜  hadolint-examples git:(main) ✗

如果实现所有建议,将获得以下 Dockerfile。

# Use Ubuntu 20.04 as the base image
FROM ubuntu:20.04# Set the default shell with -o pipefail
SHELL ["/bin/bash", "-o", "pipefail", "-c"]# Run commands
RUN apt-get update && \apt-get install -y curl=8.4.0 --no-install-recommends && \apt-get clean && \rm -rf /var/lib/apt/lists/* && \echo "hello world" | grep -c "world"# Default command to run
CMD ["echo", "Hello, world!"]

现在,如果对修正和更新的 Dockerfile 运行 Hadolint,则不会收到任何警告或信息消息。如果您检查返回值,您将获得如下图所示。0

忽略规则

在某些情况下,你可能不希望修正所有建议。在这种情况下,您可以使用 --ignore 标志忽略特定规则。

例如,如果我想忽略建议指定软件包版本的 DL3008,可以使用以下命令。

hadolint --ignore DL3008 Dockerfile

在使用 CI/CD 系统时,我们需要标准化衬里的所有配置和规则。这是配置文件hadolint.yaml的用武之地。

hadolint.yaml

handolint.yaml 是 Hadolint 的配置文件。您可以使用配置文件自定义 Hadolint 处理输出和建议的方式。

当您希望对跨组织或项目进行 linting Dockerfile 的标准化和自定义时,这特别有用。此模板可以与开发 Dockerfile 的开发人员或 DevOps 工程师共享。

您可以参考官方文档了解所有支持的参数。

让我们来看看关键参数。

  1. failure-threshold:指定 lint 应失败的级别或提供非零fanhuizhi。例如,默认情况下,Hadolinit 为所有级别提供非零退出代码。使用此参数,您可以为错误和警告配置非零退出代码。对于非零退出代码,将忽略 Info 和 style。
  2. ignored:如果要忽略特定规则,可以在 ignore 参数下列出它们。
  3. override:如果要覆盖特定规则的严重性,则此参数特别有用。例如,DL3015 规则位于 info 下。但是,您希望将其归类为警告。因此,您可以将 DL3015 添加到覆盖下的警告类别下。对于使用此配置的所有 Hadolint 运行,DL3015 将列为警告。
  4. trustedRegistries:在大多数组织中,只允许使用内部容器注册表。如果只想允许来自特定容器注册表的映像,可以在这些参数下添加这些注册表终结点。如果 Dockerfile 包含来自其他注册表的映像,则 lint 将失败。

下面是包含所有关键参数的示例配置。将以下配置另存为 .hadolint.yaml

failure-threshold: warning
format: tty
ignored:
- DL3007
override:error:- DL3015warning:- DL3015info:- DL3008style:- DL3015
trustedRegistries:
- docker.io
- techiescamp.com:5000
- "*.gcr.io"
- quay.io

您可以将配置文件与 Hadolint 一起使用,如下所示

hadolint --config .hadolint.yaml Dockerfile

在 Docker 镜像构建中使用 Hadolint

作为标准做法,开发人员可以在创建 Dockerfile 时运行 Hadolint,然后再将其推送到存储库。但是,Hadolint 的主要用途在于 Docker 映像构建管道。

可以使用 Hadolint 添加 Dockerfile 链接,作为 Docker 生成 CI 管道的一部分。当为创建/更新 Dockerfile 引发 PR 时,管道中的第一步将是 linting。

如果 Dockerfile 不遵守 Hadolint 规则,则生成将失败,开发人员可以使用 Hadolint 反馈来纠正 Dockerfile 的问题。

您可以根据组织的标准和项目要求使用该文件自定义规则和配置。hadolint.yaml

这样,您可以捕获 Dockerfile 中的所有错误,并确保它在提交到主分支之前遵循标准最佳实践。

使用 Docker 运行 Hadolint

有一种方法可以在不在您的系统中安装 Hadolint 的情况下使用它,我们可以将 Docker 镜像用于 Hadolint。下面给出了使用 Hadolint Docker 映像的命令。

docker run --rm -i hadolint/hadolint < Dockerfile

使用此命令的最佳部分是,如果系统中没有Hadolint Docker映像,它将首先下载Docker映像,然后扫描Dockerfile。

Hadolint 在线版

有一个 Hadolint 的在线版本,您可以在其中从浏览器中对 Dockerfile 进行 lint 检查。这对于快速测试很有用。

您可以在此处访问在线版本。

使用 Hadolint 的好处

根据这篇关于 Dockerfile 的 IEEE 研究论文,其数据集中近 84% 的 GitHub 项目在其 Dockerfile 代码中都有气味,尤其是 DL 气味。

使用 Hadolint 有很多好处,下面列出了一些好处:

  1. 改进了 Dockerfile 质量:Hadolint 识别 Dockerfile 中的错误,从而改进和优化 Dockerfile
  2. 降低安全风险:Hadolint 可以识别 Dockerfile 中的安全漏洞,例如使用旧的基础映像,并帮助减少攻击面。
  3. 提高性能:Hadolint 可以在 Dockerfile 中发现降低 Docker 映像性能的问题,例如构建不必要的大型映像。
  4. 提高一致性:Hadolint 确保您的 Dockerfile 与最佳实践一致,从而使它们符合您组织的策略。

使用Hadolint的提示

以下是使用 Hadolint 的一些提示:

  1. 首先修复最严重的错误:Hadolint 将为其发现的每个错误分配一个严重性级别。首先,修复最严重的错误,因为这些错误最有可能导致问题。
  2. 启用所有规则:Hadolint 附带了一组默认启用的默认规则。但是,还可以启用许多可选规则。考虑启用所有规则以使 Hadolint 高效工作。您可以根据排除要求再次自定义这些规则。
  3. 根据需要配置 Hadolint:您还可以修改启用的规则和不同冲突的严重性级别,还可以指定输出格式。

结论

在开发过程中,Linting Dockerfile 是一种很好的做法,就像在 Infra 管道中一样。我强烈建议您将 Hadolint 添加为 Docker 映像构建管道的一部分,以获得安全和优化的容器映像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

坐标转换 | EXCEL中批量将经纬度坐标(EPSG:4326)转换为墨卡托坐标(EPSG:3857)

1 需求 坐标系概念&#xff1a; 经纬度坐标&#xff08;EPSG:4326&#xff09;&#xff1a;WGS84坐标系&#xff08;World Geodetic System 1984&#xff09;是一种用于地球表面点的经纬度坐标系。它是美国国防部于1984年建立的&#xff0c;用于将全球地图上的点定位&#xff0…

Vue-2、初识Vue

1、helloword小案列 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>初始Vue</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.n…

【贪心算法】Dijkstra 算法及其衍生

目录 Dijkstra 算法Dijkstra 算法正确性证明 Dijkstra 算法的复杂度优化 Dijkstra 算法的衍生SSSP的应用 Dijkstra 算法 1959 年&#xff0c;Edsger Dijkstra 提出一个非常简单的贪心算法来求解单源最短路径问题&#xff08;Single-Source Shortest Path&#xff0c;SSSP&…

[C#]使用PaddleInference图片旋转四种角度检测

官方框架地址】 https://github.com/PaddlePaddle/PaddleDetection.git 【算法介绍】 PaddleDetection 是一个基于 PaddlePaddle&#xff08;飞桨&#xff09;深度学习框架的开源目标检测工具库。它提供了一系列先进的目标检测算法&#xff0c;包括但不限于 Faster R-CNN, Ma…

一张照片来跳舞,AI带去你跳科目三

大家好我是在看&#xff0c;记录普通人学习探索AI之路。 重生之我是秦始皇&#xff0c;起猛了看见兵马俑在跳舞。 最近&#xff0c;随着社交媒体上热议的科目三话题热度持续飙升&#xff0c;阿里集团旗下的通义千问项目团队精准把握住了这一社会潮流&#xff0c;借势推出了一…

PHP 基础编程 1

文章目录 前后端交互尝试php简介php版本php 基础语法php的变量前后端交互 - 计算器体验php数据类型php的常量和变量的区别php的运算符算数运算符自增自减比较运算符赋值运算符逻辑运算 php的控制结构ifelseelse if 前后端交互尝试 前端编程语言&#xff1a;JS &#xff08;Java…

OpenHarmony鸿蒙源码下载编译和开发环境搭建

目录 一、开发环境搭建和源码下载二、编译三、总结 一、开发环境搭建 最好是在如Ubuntu18.04以上的系统中搭建&#xff0c;不然有些软件依赖需要解决&#xff0c;加大搭建时间 如gitee中开源OpenHarmony中的文档所示&#xff0c;搭建开发环境&#xff0c;搭建文档网站如下&a…

Supershell反溯源配置

简介 项目地址&#xff1a;https://github.com/tdragon6/Supershell Supershell是一个集成了reverse_ssh服务的WEB管理平台&#xff0c;使用docker一键部署&#xff08;快速构建&#xff09;&#xff0c;支持团队协作进行C2远程控制&#xff0c;通过在目标主机上建立反向SSH隧…

【Java EE初阶六】多线程案例(单例模式)

1. 单例模式 单例模式是一种设计模式&#xff0c;设计模式是我们必须要掌握的一个技能&#xff1b; 1.1 关于框架和设计模式 设计模式是软性的规定&#xff0c;且框架是硬性的规定&#xff0c;这些都是技术大佬已经设计好的&#xff1b; 一般来说设计模式有很多种&#xff0c;…

Go语言之父:开源14年,Go不止是编程语言,究竟做对了哪些?

提及编程语言&#xff0c;2023 年&#xff0c;除了老牌的 C 和新晋之秀 Rust 热度最高之外&#xff0c;就要数 Go 了。 从 2009 年由 C 语言获取灵感而发布&#xff0c;到如今风靡已久的高性能语言&#xff0c;Go 已经走过了 14 个年头。 “Go是一个项目&#xff0c;不只是一门…

基于ssm的智慧社区电子商务系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

HTML5大作业-精致版个人博客空间模板源码

文章目录 1.设计来源1.1 博客主页界面1.2 博主信息界面1.3 我的文章界面1.4 我的相册界面1.5 我的工具界面1.6 我的源码界面1.7 我的日记界面1.8 我的留言板界面1.9 联系博主界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh …

在MS中基于perl脚本实现氢键统计

氢原子与电负性大的原子X以共价键结合&#xff0c;若与电负性大、半径小的原子Y&#xff08;O F N等&#xff09;接近&#xff0c;在X与Y之间以氢为媒介&#xff0c;生成X-H…Y形式的一种特殊的分子间或分子内相互作用&#xff0c;称为氢键。 氢键通常是物质在液态时形成的&…

第1章 线性回归

一、基本概念 1、线性模型 2、线性模型可以看成&#xff1a;单层的神经网络 输入维度&#xff1a;d 输出维度&#xff1a;1 每个箭头代表权重 一个输入层&#xff0c;一个输出层 单层神经网络&#xff1a;带权重的层为1&#xff08;将权重和输入层放在一起&#xff09; 3、…

数据库设计——DML

D M L \huge{DML} DML DML&#xff1a;数据库操作语言&#xff0c;用来对数据库中的数据进行增删改查。 增&#xff08;INSERT&#xff09; 使用insert来向数据库中增加数据。 示例&#xff1a; -- DML : 数据操作语言 -- DML : 插入数据 - insert -- 1. 为 tb_emp 表的 us…

Kubernetes二进制部署 单节点

一、环境准备 k8s集群master1&#xff1a;192.168.229.90 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群node1: 192.168.229.80 kubelet kube-proxy docker flannel k8s集群node2: 192.168.229.70 kubelet kube-proxy docker flannel 至少2C2G 常见的k…

Flutter3.X基础入门教程(2024完整版)

Flutter介绍&#xff1a; Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前Flutter已经支持 iOS、Android、Web、Windows、macOS、Linux的跨平台开发。 教程所讲内容支持…

独立式键盘控制步进电机实验

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit S1P1^4; //将S1位定义为P1.4引脚 sbit S2P1^5; //将S2位定义为P1.5引脚 sbit S3P1^6; //将S3位定义为P1.6引脚 unsigned char keyval; //储存按键值 unsigned char ID; …

bat批处理文件_命令汇总(2)

文章目录 1、换行2、返回上一级目录cd..3、隐藏指令回显echo off4、开启指令回显echo on5、用关闭echo off指令本身的回显6、echo提示信息 1、换行 cd.. echo. echo. echo. pause2、返回上一级目录cd… 3、隐藏指令回显echo off echo off echo hello1 echo hello2 pause4、开…

tomcat session cookie值设置逻辑

tomcat session cookie 值设置&#xff0c;tomcat jsessionid设置 ##调用request.getSession() Controller RequestMapping("/cookie") public class CookieController {RequestMapping("/tomcatRequest")ResponseBodypublic String tomcatRequest(HttpS…