想学习如何使用 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 映像构建管道的一部分,以获得安全和优化的容器映像。