Dockerfile优化推荐功能

容器镜像服务ACR针对企业版实例运行的构建任务,提供了Dockerfile优化推荐功能,可以帮助您找出Dockerfile中的潜在问题,以提高容器镜像的质量。该功能不会对镜像构建功能产生任何影响,并且您无需进行任何操作,就可以在构建日志中查看优化推荐的结果。本文介绍如何根据Dockerfile优化推荐的结果找出Dockerfile中的潜在问题,以进一步提高容器镜像的质量,满足企业级应用的需求。

背景信息

使用企业版构建服务,容器镜像服务可以在镜像构建前自动对构建的Dockerfile进行优化推荐。优化推荐功能会根据语法规则以及最优实践规则进行分析,最后输出分析结果。关于语法规则的更多内容,请参见官方语法规则

分析结果分为Error和Warning两种等级:

  • Error:Dockerfile中存在语法错误或容器镜像服务不支持的构建参数,此类问题将导致镜像构建出错,需要进行改正。

  • Warning:Dockerfile中存在潜在问题,可能导致构建产生非预期的结果或者镜像存在冗余数据。

分析结果格式

语法检测结果

[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

存在语法错误的Dockerfile。

# FROM指令使用了不支持的架构的基础镜像,并且没有指定多阶段构建的名称
FROM --platform=windows alpine as
# RUN指令使用了不支持的运行参数
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指令不支持拷贝远程文件
COPY https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz linux-0.01.tag.gz
# COPY/ADD拷贝的源文件路径在构建路径下不存在
COPY  <不存在的路径> /somedir/
# 错误的指令名称
CPY /foo /bar

语法检测结果输出。

[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

违背了最优实践规则的Dockerfile。

# 未指定镜像版本
FROM alpine AS a
# 安装软件包后未清除缓存
RUN apk add gcc
# 未指定镜像版本,使用了已有的阶段名
from ubuntu as a
# 安装软件包后未清除缓存,未使用--no-install-recommends避免下载不必要的软件包
RUN apt-get install -y gcc

语法检测结果输出。

[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.]

检测规则

最优实践规则

规则编号

提示等级

构建规则

推荐操作

R1001

Warning

基础镜像避免使用Latest标签镜像。

为您的基础镜像指定特定版本的镜像。

R1002

Warning

避免将apt-get update, apt-get upgradeapt-get install指令分散在不同指令中。

apt-get update, apt-get upgradeapt-get install指令合并在同一条RUN指令中进行。

R1003

Warning

使用apt-get下载软件时,添加--no-install-recommends避免下载不必要的软件包。

apt-get install指令中添加--no-install-recommends指令。

R1004

Warning

下载安装包后清空缓存,可以缩小镜像体积。

  • apt-get指令后添加apt-get cleanrm -rf /var/lib/apt/lists/*指令。

  • apk指令后添加rm -rf /var/cache/apk/*指令。

  • apk add指令中添加--no-cache参数。

  • yum指令后添加yum clean指令。

R1005

Warning

使用多阶段构建处理编译命令,可以缩小镜像体积。

对于make、go build等指令,将其放入单独的阶段进行编译,将编译结果拷贝进入业务镜像,如:

FROM alpine:3.17 as complie
COPY <source code> code/
RUN make
FROM alpine:3.17
COPY --from=compile /code/bin bin/

R1006

Warning

WORKDIR指定工作目录时,使用相对路径可能会导致使用的路径与预期不一致。

将相对路径改为绝对路径。

R1007

Error

在构建过程中使用Kill、Shutdown等指令会导致安全及稳定性问题。

去除相关指令。

R1008

Warning

在构建中使用Root用户,会导致容器在运行时存在安全性问题。

避免使用Root用户。

R1009

Warning

在构建中使用CD指令指定工作目录不会在容器运行时生效。

使用WORKDIR指令代替CD命令。

R1010

Error

在构建中使用Sudo命令是无效的。

去除sudo指令。

R1011

Error

使用EXPOSE暴露端口时,端口范围应在0~65535,协议为TCP或UDP。

使用合法的EXPOSE参数,如:8080,8081/tcp,8082/udp。

R1012

Error

使用COPY指令拷贝多个源文件时,目的路径应为目录。

确保目的路径格式为目录地址。

R1013

Error

使用COPY指令从其他构建阶段拷贝文件时,需要使用正确的阶段名。

确保阶段名是之前定义的阶段。

R1014

Error

使用多阶段构建时,阶段名不能重复。

避免使用重复的阶段名。

R1015

Error

Dockerfile中的首条指令应为FROM或ARG指令。

确保首条指令为FROM或ARG指令。

R1016

Warning

使用多条CMD指令时只有最后一条CMD指令会生效。

确保最后一条CMD指令为预期使用的指令。

R1017

Warning

使用多条ENTRYPOINT指令时只有最后一条ENTRYPOINT指令会生效。

确保最后一条ENTRYPOINT指令为预期使用的指令。

R1018

Error

使用ADD指令拷贝多个源文件时,目的路径格式应为目录地址。

确保目的路径格式为目录地址。

R1019

Warning

在解压之后删除压缩包,可缩小镜像体积。

将下载压缩包、解压压缩包和删除压缩包指令合并在同一条RUN指令中执行。