- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
Dockerfile 将 Docker 镜像的内容定义为文本文件中的一组指令。Dockerfile 语法通常很简单,但有一些问题需要避免。在团队环境中编写复杂的 Dockerfile 时遵循最佳实践可能会很棘手,除非您自动验证文件的内容。
Hadolint是一个 Dockerfile linter,可以为您发现常见问题。它使用抽象语法树 (AST) 来根据预定义的规则集解析 Dockerfile。Hadolint 还包含ShellCheck,因此它也可以在 Dockerfile 的RUN指令中检查 shell 脚本。
Hadolint 以多种格式分发。您可以通过从项目的GitHub 发布页面下载适用于您的操作系统的最新预编译二进制文件来快速开始。如果您不想直接使用二进制文件,
Hadolint 也有自己的 Docker 映像。hadolint/hadolint作为最后的选择,您可以通过网络访问 Hadolint进行实验。
将 Hadolint 路径传递给 Dockerfile 以开始新的扫描:
hadolint Dockerfile
如果您使用的是 Dockerized 版本,最简单的方法是将文件内容通过管道传输到 Hadolint 容器中:
docker run --rm -i hadolint/hadolint < Dockerfile
扫描结果将显示在您的终端中。在这个例子中,Hadolint 暗示 Dockerfile 的RUN apt-get install声明是不安全的,因为它没有指定明确的包版本。您的图像内容可能会在构建之间发生变化,从而可能会产生令人困惑的问题。
Hadolint 有几十个内置规则来检查常见的配置和安全问题。linter 旨在使您的 Dockerfile 符合Docker 建议的映像构建最佳实践。
包含的检查包括使用非 root 最终用户、在WORKDIR语句中引用相对路径、添加多个HEALTHCHECK指令以及不使用明确固定的标签和版本。由于 Hadolint 还继承了 ShellCheck 规则集,因此它也会显示该工具识别的常见 Bash 脚本问题。
规则被标识为前缀为HL或的数字SC。HL规则是 Hadolint 的一部分,而SC条目来自 ShellCheck。每个检查都有一个从错误到信息的严重性。如果您在扫描结果中出现错误,这些应该是您首先解决的问题。
Hadolint 是通过.hadolint.yaml文件配置的。它将搜索多个位置,包括您的工作.config目录、 和主目录。只使用第一个找到的文件——位置之间没有合并。
配置文件允许您通过忽略规则并更改其严重性来自定义扫描。虽然默认规则集涵盖了推荐的最佳实践,但您可能会发现某些检查不适用于您的环境。在 Dockerfile 旁边提交一个.hadolint.yaml文件可以让您相应地定制 Hadolint 扫描。大多数配置文件字段也支持作为 CLI 标志和环境变量。
规则被ignored字段禁用。这应该是规则 ID 列表:
ignored:
- DL3010
- DL3020
如果您需要降低规则的严重性而不完全禁用它,请改用override密钥。这还可以让您将低严重性问题提升到更高级别。如果您想更加强调特定问题,请使用此选项。
override:
warning:
- DL3020
这会将规则 DL3020 从其默认的“错误”级别降级为不太严重的“警告”。此规则要求您在构建上下文中引用文件和文件夹时使用COPY,而不是。ADD
您也可以调整全局严重性级别。如果任何测试报告给定严重级别的错误,设置该failure-threshold字段会指示 Hadolint 以失败状态退出:
failure-threshold: warning
该指令意味着如果在其输出中有错误或警告,Hadolint 扫描将失败。
no-fail: true您可以使用配置选项或–no-failCLI 标志禁用退出并显示失败代码。0无论实际测试结果如何,这都会指示 Hadolint 使用代码退出。如果您想将 Hadolint 作为非阻塞作业包含在 CI 管道中,它会很有用。
配置文件的另一个用途是定义您希望能够在 Dockerfiles 中引用的可信注册表。设置该trustedRegistries字段后,当使用来自另一个注册表的图像时,Hadolint 会警告您:
trustedRegistries:
- docker.io
- docker-registry.example.com
Hadolint 也提供基本的标签掉毛功能。这使您可以强制通过 DockerfileLABEL指令添加到图像的标签符合指定的约束。这是它如何工作的示例:
label-schema:
notes: text
app-version: semver
built-at: rfc3339
此配置片段定义了您可以在 Dockerfile 中使用的四个标签的数据类型。notes被声明为任意文本字段,而app-version必须是与semver 兼容的版本标识符。built-at被标记为 RFC-3339 日期时间字符串。您可以在Hadolint 文档中获得支持的类型的完整列表。
Hadolint 允许使用未在您的架构中列出的标签。您可以通过设置或使用标志禁用此功能并将LABEL指令限制为仅存在于模式中的指令。strict-labels: true–strict-labels
format通过选项或–format标志支持多种输出格式。默认值是tty向终端发出彩色输出。可以使用–no-color标志禁用颜色。
可以使用以下替代格式化程序:
这些输出格式非常适合以编程方式使用 Hadolint 或作为 CI 管道的一部分。
Hadolint 自动检测 Dockerfile 问题。这有助于您的 Docker 映像遵守最佳实践和组织标准。默认配置是一个很好的起点,但您可以通过重新分类和禁用规则来自定义它以满足您的需求。
您应该考虑将 Hadolint 与您的 CI 工具集成,以便在提交 Dockerfile 更改时获得即时报告。这通过让开发人员立即了解问题来加速代码审查。您还可以在通过社区支持的编辑器扩展工作时在本地使用该工具,从而提供更短的反馈循环。
PHPLint、JSLint,我最近在阅读一些IDE. 那么,什么是“linting”? 最佳答案 Linting 是运行程序的过程,该程序将分析代码是否存在潜在错误。 参见lint在维基百科上: l
Elixir是否有 Lint (如Javascript)可以检查每个函数是否具有类型规范? 最佳答案 有一个Erlang编译器开关+warn_missing_spec可以做到这一点,但是目前我无法使其
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
例如,我让它在 .rb 和 .js 文件上匹配。 例如**/*.{js,rb} 并且还想在 Gemfile 和 Rakefile 上进行匹配。 最佳答案 解决方案是递归地使用 {},例如 "lin
我有一个自述文件,其中包含文件夹的文档、包含的库以及如何使用它们。 自述文件不是任何库的一部分,因此 nx-lint 会引发此错误: NX ERROR The following file(s
我的 React Native 构建突然失败并出现错误,尽管一天前工作得很好,没有任何相关的更改。 FAILURE: Build failed with an exception. * What we
我有一个 lint-gradle-api.jar 错误,我在论坛上查看了其他类似的问题,但我仍然有问题。有人有想法吗? Error running Gradle: Exit code 1 from:
我已经将 Android Studio 更新到 3.2.1,现在停止了这样的问题:找不到 lint-gradle-api.jar (com.android.tools.lint:lint-gradle
我目前正在从 tslint 迁移到 eslint。我在我的 .eslintignore 中配置了几个文件夹,我想从 linting 中完全忽略它们。这确实有效,但现在我收到错误: “无效的 lint
Q (tldr;): 我如何使用 android-lint 中的 JavaScanner 检查特定函数调用是否具有特定作为参数的字符串已被 try/catch block 包围。 详细信息:我已经完成
我有一个在 Cocoapods 上发布的库。 当我运行pod lib lint时从包含 MyProject.podspec 的目录中,命令行挂起 $ pod lib lint -> MyProject
我正在尝试使用 Android lint 来检查有关我的项目的一些事情。它似乎忽略了我提供的 lint.xml 文件,使我无法启用检查。 我在 Ubuntu 14.04 上使用 Android Stu
我正在使用工具栏附带的 CodeMirror 设计一个应用程序。由于性能原因,我没有通过异步或异步模式执行 lint。 我在工具栏中提供了一个图标,单击它我正在解析和构建错误。但是我对如何在编辑器中更
使用 ./gradlew lintDebug 生成 Android lint 报告时,报告中不包括 javac lint 错误,例如弃用或未经检查的转换。 我目前只是在编译时启用这些 javac 选项
默认情况下,在 gradle 中为发布构建启用了 lint。没有 abortOnError false 此选项会中止构建。 我的发布构建成功执行(没有 lint 警告),但是当我通过 gradle 调
我有一个使用 Android 构建工具版本 1.3.1 的 gradle Android 构建,并对我的代码运行 lint 检查。运行 Sonar 任务(由 org.sonarqube gradle
只是想知道是否有人可以帮助我进行 Gulp 设置。目前我正在使用 gulp-sass 和 gulp-scss-lint 进行监视任务。我想要发生的是,当为 linting 任务完全运行保存一个 scs
我正在做一个项目,最近更新到 android Gradle 构建工具 3.0.0 (com.android.tools.build:gradle:3.0.0)。我现在在通过 Android studi
我有一个带有 gradle 的 Android 项目。虽然 gradle 插件是 2.x.x,但运行 ./gradlew lint 的时间大约为 4 分钟。我已经将项目升级到 gradle plugi
事情是这样的。我有一个与 API 15 及更高版本兼容的应用程序,但由于它非常大并且我已经达到 65k 方法限制,我不得不将它设为 MultiDexApplication 类的后代。这会稍微减慢构建时
我是一名优秀的程序员,十分优秀!