23

如果 Dockerfile 写入错误,例如:

CMD ["service", "--config", "/etc/service.conf](缺少报价)

有没有办法在构建之前对其进行检查以检测此类错误?

4

6 回答 6

24

尝试:

我使用 、 和 对一个简单的 Docker 文件进行了RUN简单ADDENV测试CMD。很聪明地将相同的违反规则分组在一起,但由于缺乏对Bash 代码的静态分析,dockerlinter它无法进行尽可能彻底的检查。hadolinterShellcheck

尽管dockerlinter它的 lint 范围不足,但它似乎确实更容易安装。npm install -g dockerlinter会做,而编译hadolinter需要一个 Haskell 编译器和构建环境,需要永远编译。

$ hadolint ./api/Dockerfile
L9 SC2046 Quote this to prevent word splitting.
L11 SC2046 Quote this to prevent word splitting.
L8 DL3020 Use COPY instead of ADD for files and folders
L10 DL3020 Use COPY instead of ADD for files and folders
L13 DL3020 Use COPY instead of ADD for files and folders
L18 DL3020 Use COPY instead of ADD for files and folders
L21 DL3020 Use COPY instead of ADD for files and folders
L6 DL3008 Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
L6 DL3009 Delete the apt-get lists after installing something
L6 DL3015 Avoid additional packages by specifying `--no-install-recommends`

$ dockerlint ./api/Dockerfile
WARN:  ADD instruction used instead of COPY on line 8, 10, 13, 18, 21
ERROR: ./api/Dockerfile failed.

2018 年更新。由于hadolint现在有官方的 Docker 存储库,您可以快速获取可执行文件:

id=$(docker create hadolint/hadolint:latest)
docker cp "$id":/bin/hadolint .
docker rm "$id"

或者你可以使用这个命令

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

这是一个静态编译的可执行文件(根据ldd hadolint),因此无论安装的库如何,它都应该运行。关于如何构建可执行文件的参考:https ://github.com/hadolint/hadolint/blob/master/docker/Dockerfile 。

于 2016-01-12T19:19:47.743 回答
3

如果您订阅了 RedHat,您可以直接在https://access.redhat.com/labs/linterfordockerfile/访问“Linter for Dockerfile”应用程序;有关应用程序的信息位于https://access.redhat.com/labsinfo/linterfordockerfile

如果您希望在本地运行此 Node.js 应用程序,也可以在 GitHub https://github.com/redhataccess/dockerfile_lint上找到它。

于 2015-02-11T07:09:16.540 回答
2

我在 CI 管道 npm 的dockerfile_lint中使用非常成功。您可以添加或扩展规则。使用package.json您可以为不同的作业创建不同的配置。两者都有

码头工人 CLI

docker run -it --rm --privileged -v `pwd`:/root/ \
         projectatomic/dockerfile-lint \
         dockerfile_lint [-f Dockerfile]

docker run -it --rm --privileged -v `pwd`:/root/  \
         -v /var/run/docker.sock:/var/run/docker.sock \
         projectatomic/dockerfile-lint \       
         dockerfile_lint  image <imageid>

和可用的原子 CLI

 atomic run projectatomic/dockerfile-lint

 atomic run projectatomic/dockerfile-lint image <imageid>

您还可以对图像进行 lint 标记以进行标记。

于 2016-08-09T08:23:07.560 回答
1

我创建了dockerfile-validator作为 VS Code 的扩展,它使用了上一个答案中提到的dockerfile-lint 。默认情况下,它使用 dockerfile-lint 默认规则,但在 VS 代码用户设置 (dockerfile-validator.rulefile.path) 中,您可以使用自己的编码标准指定自定义规则文件的路径。

于 2018-06-02T12:58:16.887 回答
0

Recently, I cam across dockerfilelint which is NodeJS based.

dockerfilelint Dockerfile

Supports following rules and rudimentary CMD checks

required_params
uppercase_commands
from_first
invalid_line
sudo_usage
apt-get_missing_param
apt-get_recommends
apt-get-upgrade
apt-get-dist-upgrade
apt-get-update_require_install
apkadd-missing_nocache_or_updaterm
apkadd-missing-virtual
invalid_port
invalid_command
expose_host_port
label_invalid
missing_tag
latest_tag
extra_args
missing_args
add_src_invalid
add_dest_invalid
invalid_workdir
invalid_format
apt-get_missing_rm
deprecated_in_1.13

Hadolint seems like a better option but this may suffice for simple needs. Also, Github's super-linter uses this.

于 2020-07-10T23:05:16.680 回答
-1

I'm not too familiar with go but it looks like you can simply call the Parse method as is done in the test suite here. If that does not return an err then your lint passes. I'm assuming that's trivial to expose to a script or something to call during development.

于 2015-01-28T06:22:48.090 回答