dockerfile掃描工具現(xiàn)狀
docker鏡像一般都是根據(jù)dockerfile構(gòu)建而來,一個(gè)dockerfile書寫的好壞直接決定了docker鏡像本身的質(zhì)量。所以有必要對(duì)dockerfile進(jìn)行規(guī)則掃描,剔除其中不符合最佳實(shí)踐的一些寫法。
截止到2019年12月底,社區(qū)比較出色的dockerfile掃描工具有:hadolint、dockerlint和紅帽推出的dockerfile_lint??傮w上來說這三個(gè)工具其實(shí)都不完善,基本上處于alpha之前的狀態(tài)。
- hadolint是目前為止成熟最高的一個(gè)工具,一共支持60多條的自帶規(guī)則。而且hadolint還支持對(duì)Run命令中帶的shell命令進(jìn)行審計(jì)。這一點(diǎn)功能是目前其他競品不具備的。不過hadolint使用Haskell語言編寫,且目前不支持規(guī)則文件導(dǎo)入。
如果有新的規(guī)則需要編程實(shí)現(xiàn)。 - dockerlint 使用coffee_script語言編寫,自帶規(guī)則數(shù)量小于hadolint;也不支持規(guī)則文件導(dǎo)入功能。
- dockerfile_lint 紅帽發(fā)布,使用node.js編寫的一個(gè)dockerfile掃描工具。支持的規(guī)則數(shù)量小于hadolint,但是支持通過yaml文件方式導(dǎo)入用戶自定義規(guī)則。
從以上分析來看,我認(rèn)為dockerfile_lint其實(shí)更具潛力,因?yàn)閐ockerfile掃描規(guī)則其實(shí)是不固定的。每個(gè)用戶都可以有自己的dockerfile掃描規(guī)范,所以通過腳本添加規(guī)則其實(shí)是一種剛需。 hadolint和dockerlint恰恰不具備這個(gè)能力,所以我最終選擇了dockerfile_lint作為掃描工具。
dockerfile_lint工具的使用
dockerfile_lint代碼在github.com/projectatomic/dockerfile_lint下,有兩種方法執(zhí)行dockerfile_lint:
- 從dockerhub官方下載dockerfile_lint latest的docker鏡像。
- 在nodejs執(zhí)行環(huán)境上,運(yùn)行dockerfile_lint掃描工具。
因?yàn)閚odejs執(zhí)行環(huán)境本人沒有搭建經(jīng)驗(yàn),所以直接選擇最簡單的方式從dockerhub官方下載dockerfile_lint鏡像。下面基于docker鏡像方式介紹dockerfile_lint功能。
docker run -it --privileged -v target_dockerfile_dir:/target/ projectatomic/dockerfile-lint:latest /bin/bash
[root@4298ab08644f /]#dockerfile_lint -f /target/Dockerfile -v
dockerfile_lint 支持下面參數(shù)
-h 打印help信息
-j 結(jié)果以jason格式輸出
-r rulefile 指定一個(gè)規(guī)則文件。
-v 打印debug新秀
-f 指定dockerfile的路徑
-e 打印出目前的規(guī)則
dockerfile_lint 規(guī)則
目前為止dockerfile_lint默認(rèn)情況下帶了default_rules.yaml和base_rules.yaml。如果不指定任何rulefile,那么系統(tǒng)默認(rèn)采用這兩個(gè)規(guī)則文件,在docker鏡像的/opt/dockerfile_lint/config/目錄下。此外在/opt/dockerfile_lint/sample_rules下面還帶了很多事例rule??梢灾苯釉谌萜鲀?nèi)部修改default_rules.yaml和base_rules.yaml文件,然后再運(yùn)行dockerfile_lint。
可以看到dockerfile_lint的規(guī)則基本上都是基于正則匹配的,所以用戶可以很方便的擴(kuò)展新的規(guī)則。
需要注意的是dockerfile_lint語法中required_instruction域中的count字段在19年12月截止的版本中是無效的。