Dockerfile優(yōu)化推薦功能
容器鏡像服務(wù)ACR針對(duì)企業(yè)版實(shí)例運(yùn)行的構(gòu)建任務(wù),提供了Dockerfile優(yōu)化推薦功能,可以幫助您找出Dockerfile中的潛在問題,以提高容器鏡像的質(zhì)量。該功能不會(huì)對(duì)鏡像構(gòu)建功能產(chǎn)生任何影響,并且您無需進(jìn)行任何操作,就可以在構(gòu)建日志中查看優(yōu)化推薦的結(jié)果。本文介紹如何根據(jù)Dockerfile優(yōu)化推薦的結(jié)果找出Dockerfile中的潛在問題,以進(jìn)一步提高容器鏡像的質(zhì)量,滿足企業(yè)級(jí)應(yīng)用的需求。
背景信息
使用企業(yè)版構(gòu)建服務(wù),容器鏡像服務(wù)可以在鏡像構(gòu)建前自動(dòng)對(duì)構(gòu)建的Dockerfile進(jìn)行優(yōu)化推薦。優(yōu)化推薦功能會(huì)根據(jù)語法規(guī)則以及最優(yōu)實(shí)踐規(guī)則進(jìn)行分析,最后輸出分析結(jié)果。關(guān)于語法規(guī)則的更多內(nèi)容,請(qǐng)參見官方語法規(guī)則。
分析結(jié)果分為Error和Warning兩種等級(jí):
Error:Dockerfile中存在語法錯(cuò)誤或容器鏡像服務(wù)不支持的構(gòu)建參數(shù),此類問題將導(dǎo)致鏡像構(gòu)建出錯(cuò),需要進(jìn)行改正。
Warning:Dockerfile中存在潛在問題,可能導(dǎo)致構(gòu)建產(chǎn)生非預(yù)期的結(jié)果或者鏡像存在冗余數(shù)據(jù)。
分析結(jié)果格式
語法檢測結(jié)果
[Error] <Error message> at line <line number>: <Specific instruction content>
[Warning] <Warning message> at line <line number>: <Specific instruction content>
[Error] [Rule <Rule id>] <Error message> at line <line number>: <Specific instruction content>
[Warning] [Rule <Rule id>] <Warning message> at line <line number>: <Specific instruction content>
示例1
存在語法錯(cuò)誤的Dockerfile。
# FROM指令使用了不支持的架構(gòu)的基礎(chǔ)鏡像,并且沒有指定多階段構(gòu)建的名稱
FROM --platform=windows alpine as
# RUN指令使用了不支持的運(yùn)行參數(shù)
RUN --security=insecure cat /proc/self/status | grep CapEff
# ADD指令缺少目的路徑
ADD https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz
# COPY指令不支持拷貝遠(yuǎn)程文件
COPY https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz linux-0.01.tag.gz
# COPY/ADD拷貝的源文件路徑在構(gòu)建路徑下不存在
COPY <不存在的路徑> /somedir/
# 錯(cuò)誤的指令名稱
CPY /foo /bar
語法檢測結(jié)果輸出。
[parse stage begin.]
[Error] Unsupported target architecture at line 2: windows.
[Error] Lack of stage name at line 2.
[Error] Unsupported security mode at line 4: insecure.
[Error] Lack of dest at line 6.
[Error] COPY does not support remote links. Please use the ADD instruction at line 8: https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz.
[Error] Source path is not exist at line 10: <不存在的路徑>.
[Error] Unknown instruction at line 12: CPY.
[Warning] No tag specified at line 2: from ["--platform=windows"] "alpine" "as".
[parse successfully, takes 0s.]
示例2
違背了最優(yōu)實(shí)踐規(guī)則的Dockerfile。
# 未指定鏡像版本
FROM alpine AS a
# 安裝軟件包后未清除緩存
RUN apk add gcc
# 未指定鏡像版本,使用了已有的階段名
from ubuntu as a
# 安裝軟件包后未清除緩存,未使用--no-install-recommends避免下載不必要的軟件包
RUN apt-get install -y gcc
語法檢測結(jié)果輸出。
[parse stage begin.]
[Warning] [Rule1003]When installing software with apt-get, it is recommended to include the --no-install-recommends parameter at line 8: RUN apt-get install -y gcc .
[Warning] No tag specified at line 2: FROM alpine AS a .
[Warning] No tag specified at line 6: from ubuntu as a .
[Warning] [Rule1001]Using a base image with a specific tag instead of the latest image.
[Error] Duplicate stage names with line 2: a at line 6: from ubuntu as a .
[Error] [Rule1014]Do not use duplicate stage names.
[parse successfully, takes 0s.]
檢測規(guī)則
最優(yōu)實(shí)踐規(guī)則
規(guī)則編號(hào) | 提示等級(jí) | 構(gòu)建規(guī)則 | 推薦操作 |
R1001 | Warning | 基礎(chǔ)鏡像避免使用Latest標(biāo)簽鏡像。 | 為您的基礎(chǔ)鏡像指定特定版本的鏡像。 |
R1002 | Warning | 避免將 | 將 |
R1003 | Warning | 使用 | 在 |
R1004 | Warning | 下載安裝包后清空緩存,可以縮小鏡像體積。 |
|
R1005 | Warning | 使用多階段構(gòu)建處理編譯命令,可以縮小鏡像體積。 | 對(duì)于make、go build等指令,將其放入單獨(dú)的階段進(jìn)行編譯,將編譯結(jié)果拷貝進(jìn)入業(yè)務(wù)鏡像,如:
|
R1006 | Warning | WORKDIR指定工作目錄時(shí),使用相對(duì)路徑可能會(huì)導(dǎo)致使用的路徑與預(yù)期不一致。 | 將相對(duì)路徑改為絕對(duì)路徑。 |
R1007 | Error | 在構(gòu)建過程中使用Kill、Shutdown等指令會(huì)導(dǎo)致安全及穩(wěn)定性問題。 | 去除相關(guān)指令。 |
R1008 | Warning | 在構(gòu)建中使用Root用戶,會(huì)導(dǎo)致容器在運(yùn)行時(shí)存在安全性問題。 | 避免使用Root用戶。 |
R1009 | Warning | 在構(gòu)建中使用CD指令指定工作目錄不會(huì)在容器運(yùn)行時(shí)生效。 | 使用WORKDIR指令代替CD命令。 |
R1010 | Error | 在構(gòu)建中使用Sudo命令是無效的。 | 去除sudo指令。 |
R1011 | Error | 使用EXPOSE暴露端口時(shí),端口范圍應(yīng)在0~65535,協(xié)議為TCP或UDP。 | 使用合法的EXPOSE參數(shù),如:8080,8081/tcp,8082/udp。 |
R1012 | Error | 使用COPY指令拷貝多個(gè)源文件時(shí),目的路徑應(yīng)為目錄。 | 確保目的路徑格式為目錄地址。 |
R1013 | Error | 使用COPY指令從其他構(gòu)建階段拷貝文件時(shí),需要使用正確的階段名。 | 確保階段名是之前定義的階段。 |
R1014 | Error | 使用多階段構(gòu)建時(shí),階段名不能重復(fù)。 | 避免使用重復(fù)的階段名。 |
R1015 | Error | Dockerfile中的首條指令應(yīng)為FROM或ARG指令。 | 確保首條指令為FROM或ARG指令。 |
R1016 | Warning | 使用多條CMD指令時(shí)只有最后一條CMD指令會(huì)生效。 | 確保最后一條CMD指令為預(yù)期使用的指令。 |
R1017 | Warning | 使用多條ENTRYPOINT指令時(shí)只有最后一條ENTRYPOINT指令會(huì)生效。 | 確保最后一條ENTRYPOINT指令為預(yù)期使用的指令。 |
R1018 | Error | 使用ADD指令拷貝多個(gè)源文件時(shí),目的路徑格式應(yīng)為目錄地址。 | 確保目的路徑格式為目錄地址。 |
R1019 | Warning | 在解壓之后刪除壓縮包,可縮小鏡像體積。 | 將下載壓縮包、解壓壓縮包和刪除壓縮包指令合并在同一條RUN指令中執(zhí)行。 |