想学习如何使用 Hadolint 对 Dockerfile 进行 lint 处理吗?这篇博文将向您展示如何操作。这是关于 Dockerfile linting 的完整指南。
通过对 Dockerfile 进行 lint 检查,您可以及早发现错误和问题,并确保它们遵循最佳实践。
Hadolint 是一个使用 Haskell 构建的开源命令行 Dockerfile linter 工具,可帮助您编写无错误的 Dockersfile。Hadolint 会检查您的 Dockerfile 是否存在可能的错误、安全漏洞和性能问题。它在 GitHub 上有超过 9k 的启动
这是它的工作原理。
现在我们已经对 Hadolint 有了基本的了解,让我们继续安装并查看它的实际效果。
您可以在 Linux、Mac 和 Windows 系统上安装 Hadolint。
如果要在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 系统上安装 Hadolint。
brew install hadolint
要检查 Linux 或 Mac 系统上是否安装了 Hadolint,请运行以下命令:
hadolint --version
使用 scoop 在 Windows 上安装 Hadolint
scoop install hadolint
安装 hadolint 后,您将拥有 hadolint CLI 来对 Dockerfile 运行 lint 测试。
要了解所有 CLI 选项,可以使用 –help 标志。
hadolint --help
要使用 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
的用武之地。
handolint.yaml
是 Hadolint 的配置文件。您可以使用配置文件自定义 Hadolint 处理输出和建议的方式。
当您希望对跨组织或项目进行 linting Dockerfile 的标准化和自定义时,这特别有用。此模板可以与开发 Dockerfile 的开发人员或 DevOps 工程师共享。
您可以参考官方文档了解所有支持的参数。
让我们来看看关键参数。
下面是包含所有关键参数的示例配置。将以下配置另存为 .hadolint.yaml
failure-threshold: warning
format: tty
ignored:
- DL3007
override:
error:
- DL3015
warning:
- DL3015
info:
- DL3008
style:
- DL3015
trustedRegistries:
- docker.io
- techiescamp.com:5000
- "*.gcr.io"
- quay.io
您可以将配置文件与 Hadolint 一起使用,如下所示
hadolint --config .hadolint.yaml Dockerfile
作为标准做法,开发人员可以在创建 Dockerfile 时运行 Hadolint,然后再将其推送到存储库。但是,Hadolint 的主要用途在于 Docker 映像构建管道。
可以使用 Hadolint 添加 Dockerfile 链接,作为 Docker 生成 CI 管道的一部分。当为创建/更新 Dockerfile 引发 PR 时,管道中的第一步将是 linting。
如果 Dockerfile 不遵守 Hadolint 规则,则生成将失败,开发人员可以使用 Hadolint 反馈来纠正 Dockerfile 的问题。
您可以根据组织的标准和项目要求使用该文件自定义规则和配置。hadolint.yaml
这样,您可以捕获 Dockerfile 中的所有错误,并确保它在提交到主分支之前遵循标准最佳实践。
有一种方法可以在不在您的系统中安装 Hadolint 的情况下使用它,我们可以将 Docker 镜像用于 Hadolint。下面给出了使用 Hadolint Docker 映像的命令。
docker run --rm -i hadolint/hadolint < Dockerfile
使用此命令的最佳部分是,如果系统中没有Hadolint Docker映像,它将首先下载Docker映像,然后扫描Dockerfile。
有一个 Hadolint 的在线版本,您可以在其中从浏览器中对 Dockerfile 进行 lint 检查。这对于快速测试很有用。
您可以在此处访问在线版本。
根据这篇关于 Dockerfile 的 IEEE 研究论文,其数据集中近 84% 的 GitHub 项目在其 Dockerfile 代码中都有气味,尤其是 DL 气味。
使用 Hadolint 有很多好处,下面列出了一些好处:
以下是使用 Hadolint 的一些提示:
在开发过程中,Linting Dockerfile 是一种很好的做法,就像在 Infra 管道中一样。我强烈建议您将 Hadolint 添加为 Docker 映像构建管道的一部分,以获得安全和优化的容器映像。