使用 .Dockerignore 文件
我们知道,我们可以在提供低成本高计算能力的云服务上运行我们的 Docker 镜像。所以,人们可能会好奇为什么我们需要优化 Docker 镜像。想象一下这种情况:你在 Docker 容器中复制了一个大型文件,而实际上你并不需要它。很明显,这会增加 Docker 镜像的大小,增加镜像的整体构建时间,并导致许多缓存问题。那么,为什么不使用一种简单的技术来避免所有这些问题并提高 Docker 构建过程的整体性能呢?
什么是 .dockerignore 文件?
类似于 .gitignore 文件,**.Dockerignore** 文件允许你列出构建镜像时可能要忽略的文件和/或目录。这肯定会减小镜像的大小,并有助于加快 Docker 构建过程。为了理解整个过程,我们首先需要了解什么是**Docker 构建上下文**。
什么是 Docker 构建上下文?
我们知道 Docker 本质上是一个客户端-服务器应用程序。它有一个 Docker 客户端,我们通过命令行工具在本地机器上运行它,还有一个 Docker 服务器,也称为 Docker 守护进程。通过命令行运行的 Docker 客户端需要与 Docker 服务器(守护进程)通信,这就是指令执行的方式。其中一项任务是构建 Docker 镜像。此外,需要注意的是,Docker 服务器可以在远程机器、本地机器甚至云端运行。
当我们尝试构建 Docker 镜像时,我们需要将文件发送到 Docker 服务器。这些文件基本上就是构建上下文。这些文件由 Docker 客户端存档到一个 .tar 文件中,然后上传到 Docker 服务器。
它有什么帮助?
在将文件发送到 Docker 服务器之前,Docker 客户端(命令行界面)开始在构建上下文的根目录中搜索名为 .dockerignore 的文件。如果找到此文件,CLI(客户端)将修改构建上下文以排除 .dockerignore 文件中提到的那些文件和目录。
使用 .dockerignore 文件的好处
减小镜像大小
很明显,如果构建上下文较小,Docker 镜像的大小也会较小,因此将较小的镜像上传到任何云服务或发送到另一个远程服务器的成本将低于大型镜像。
缓存失效
重要的是要理解,最常见的做法是使用以下命令复制整个目录或构建上下文来创建镜像。
WORKDIR /usr/src/app COPY . .
现在,如果我们决定更改构建上下文,每次这样做都会创建一个新的镜像层,如果 Docker 镜像很大,或者换句话说,如果它包含大型不必要的文件,这将非常昂贵。任何更改都将导致缓存失效,并破坏后续命令的缓存。因此,始终最好从构建上下文中删除大型不必要的文件。
安全问题
你的构建上下文中可能有一些重要的源文件或包含密钥或密码的文件。你可能不希望将这些重要文件暴露在最终的 Docker 镜像中。例如,在 Docker 镜像中暴露你的 .git 文件夹。因此,始终建议通过在 .dockerignore 文件中提及这些文件和文件夹来忽略它们。
如何创建 .dockerignore 文件?
以下是一些如何在 .dockerignore 文件中提及文件、文件夹和目录的示例。
#Ignore the logs directory logs/ #Ignoring the password file passwords.txt #Ignoring git and cache folders .git .cache #Ignoring all the markdown and class files *.md **/*.class
忽略 Dockerfile?
这里可能出现另一个问题,在构建 Docker 镜像时,我们能否以及是否应该忽略 Dockerfile?
这个问题的答案主要取决于开发者的偏好。如果你希望让你的用户了解创建 Docker 镜像的规则,则不应在 .dockerignore 文件中提及它。如果你想将其保密,你可以添加它。
总之,始终建议你在构建上下文中创建一个 .dockerignore 文件,以使你的 Docker 镜像更小、更安全,并使构建过程更快。