编写 Dockerfile 的最佳实践

dockeroperating systemopen source更新于 2026/1/6 6:07:17

如果您要构建一个新的容器镜像,则需要在名为 Dockerfile 的单独文档中指定相关指令。这将允许开发人员创建执行环境,并帮助其自动化流程并使其可重复。它为您提供灵活性、可读性、可追溯性,并有助于轻松进行项目版本控制。

毫无疑问,编写 Dockerfile 是使用 Docker 进行开发的项目最重要的方面之一。但是,如果您要大规模部署项目,Dockerfile 的编写方式可能会对项目性能产生重大影响。

在我们深入分析如何高效创建 Dockerfile 以帮助您提升项目性能之前,需要注意的一点是,任何 Docker 镜像的架构都可以被视为一个分层结构,其中包含一些可以从 Dockerhub 拉取的基础镜像,以及在此基础上对基础镜像进行一些修改或添加新镜像。这种架构允许用户重用已拉取的 Docker 镜像,高效利用磁盘存储,并缓存 Docker 构建过程。

因此,以下是一些有助于提升 Docker 项目性能的基本实践。

语句顺序很重要。

您需要按以下方式排列步骤:更改频率最低的语句首先出现。这是因为,当您更改或修改 Dockerfile 中的一行,并且其缓存失效时,后续行将因这些更改而中断。因此,您需要将最常更改的行放在最后。

请考虑以下示例。

FROM python:3

#设置工作目录
WORKDIR /usr/src/myapp

#复制容器中的所有文件
COPY . .

RUN apt-get -y update
RUN apt-get -y install vim

#指定要公开的端口号
EXPOSE 8887

#运行命令
CMD ["python3", "./file.py"]

这可以修改为 -

FROM python:3

#设置工作目录
WORKDIR /usr/src/myapp

RUN apt-get -y update

RUN apt-get -y install vim

#复制容器中的所有文件
COPY . .

#指定要公开的端口号
EXPOSE 8887

#运行命令
CMD ["python3", "./file.py"]

构建缓存。

构建 Docker 镜像时,Docker 会尝试逐条执行 Dockerfile 中的指令。在每条指令执行过程中,Docker 都会在缓存中查找任何现有的镜像层,如果不存在,则会创建一个新的镜像层。现在,如果我们在构建命令中将 --no-cache 选项设置为 true,docker 将完全不使用缓存,因此,对于每条指令,它都会尝试构建一个新的镜像层。

尽量避免安装不必要的软件包。

安装不必要的软件包只会增加构建时间并降低整体性能。因此,请尝试仅指定和安装项目中实际需要的软件包。一种有用的方法是通过在单独的 requirements.txt 文件中指定软件包,然后运行以下命令来安装软件包。

RUN pip3 install -r requirements.txt

这有助于以单独且更精确的方式跟踪您安装的软件包。

始终使用 .dockerignore 文件。

与 .gitignore 类似,docker 为其开发人员提供了一个创建 .dockerignore 文件的选项,该文件有助于排除该文件中提到的某些文件或目录。这有助于提高构建性能。

尝试包含更具体的 COPY 语句。

您应该始终尝试仅将实际需要的文件从目录复制到 Docker 容器。这有助于避免缓存爆发。因为在构建镜像并执行复制语句后所做的任何更改都会破坏缓存语句。

尝试链接所有可缓存单元。

每个 RUN 语句都可以被视为一个可缓存单元。尝试将所有 RUN 语句链接成一个语句。此外,请确保链接过多的 RUN 语句很容易导致缓存爆发。

例如,

RUN apt-get -y update
RUN apt-get -y install vim

可以写成

RUN apt-get update \
&& apt-get -y install vim

尽量避免安装不需要的软件包依赖项。

在构建镜像之前,尽量删除所有未使用的软件包或依赖项。您可以使用 --no-install-recommends 参数来配置 apt 软件包管理器,使其不安装多余的软件包。

以上是在创建 dockerfile 时可以采取的一些措施,这些措施可以提升项目性能,并有助于更高效、更灵活地管理项目,同时允许开发人员在多个项目中多次重用代码。


相关文章