编写Dockerfile的最佳实践


如果你想构建一个新的容器镜像,你需要在一个名为Dockerfile的单独文档中指定指令。这将允许开发者创建一个执行环境,并帮助他自动化流程并使其可重复。它提供了灵活性和可读性,提高了问责制,并有助于轻松进行项目的版本控制。

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

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

因此,这里有一些最佳实践,可以帮助你提升docker项目的性能。

语句的顺序很重要。

你需要以一种方式来排序你的步骤,使变化最少的语句先出现。这是因为当你更改或修改Dockerfile中的一行并使其缓存失效时,后续行将由于这些更改而中断。因此,你需要尽可能将变化最频繁的行放在最后。

请看下面的例子。

FROM python:3

#set working directory
WORKDIR /usr/src/myapp

#copying all the files in the container
COPY . .

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

#specify the port number to be exposed
EXPOSE 8887

# run the command
CMD ["python3", "./file.py"]

这可以修改为 -

FROM python:3

#set working directory
WORKDIR /usr/src/myapp

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

#copying all the files in the container
COPY . .

#specify the port number to be exposed
EXPOSE 8887

# run the command
CMD ["python3", "./file.py"]

构建缓存。

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

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

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

RUN pip3 install -r requirements.txt

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

始终使用.dockerignore文件。

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

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

你应该始终尝试只将从你的目录到docker容器中实际需要的文件复制进去。这有助于避免缓存失效。因为你在构建镜像后对复制语句所做的任何更改都会破坏缓存语句。

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

每个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时可以采取的一些措施,这些措施可以提高项目的性能,并帮助以更高的效率和灵活性的管理项目,同时允许开发者在多个项目中多次重用代码。

更新于:2020年10月1日

浏览量:257

开启你的职业生涯

通过完成课程获得认证

开始学习
广告