网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
想学习如何使用 Hadolint 对 Dockerfile 进行 lint 处理吗?这篇博文将向您展示如何操作。这是关于 Dockerfile linting 的完整指南。
通过对 Dockerfile 进行 lint 检查,您可以及早发现错误和问题,并确保它们遵循最佳实践。
什么是Hadolint?
Hadolint 是一个使用 Haskell 构建的开源命令行 Dockerfile linter 工具,可帮助您编写无错误的 Dockersfile。Hadolint 会检查您的 Dockerfile 是否存在可能的错误、安全漏洞和性能问题。它在 GitHub 上有超过 9k 的启动
这是它的工作原理。
- Hadolint 读取 Dockerfile
- 它将 Dockerfile 解析为 AST(抽象语法树),以标识与其关联的每个指令和参数。
- 然后,它根据预定义的规则集检查每条指令,这些规则涵盖安全性、效率和代码质量。这些规则是 Hadolint 源代码的一部分。您可以在此处查看规则列表。
- Hadolint 会标记所有违反规则的行为,并会针对所有检测到的问题创建反馈。
问题的严重性分类如下:
- Info– 您将获得有关信息改进的建议。它被认为不太严重。
- Style – 与 Dockerfile 的格式或结构相关,例如使用缩进或使用长单行等。
- Warning – 不太严重的问题和需要改进的次要安全问题。
- 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
的用武之地。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
tz3yHgx-1715654347660)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新