翻译docker官方文档(残缺版)

Build with docker(使用 Docker 技术构建应用程序或系统镜像)

Overview (概述)

介绍(instruction)

层次结构(Layers)

The order of Dockerfile instructions matters. A Docker build consists of a series of ordered build instructions. Each instruction in a Dockerfile roughly translates to an image layer. The following diagram illustrates how a Dockerfile translates into a stack of layers in a container image.

Dockerfile指令的顺序很重要。Docker构建由一系列有序的构建指令组成。Dockerfile中的每条指令都大致对应为一个镜像层次。下图说明了Dockerfile如何转换为容器镜像中的层堆栈。

缓存层(Cached Layers)

当你运行构建(build)时,构建器(builder)会尝试重用之前构建的层。如果镜像的某个层自上次构建以来没有变化,构建器会从构建缓存中获取该层。但是,如果某个层在上次构建后发生了变化,那么该层及其后续的所有层都必须重新构建。

在上一节的示例中,Dockerfile 首先使用 COPY . . 指令将所有项目文件复制到容器中。然后,在下一步中,它使用 RUN go mod download 命令下载应用程序的依赖项。如果你修改了任何项目文件,例如添加、修改或删除文件,它将使得 COPY的缓存无效,并且也会使得所有后续的层的缓存无效。

当缓存无效时,Docker 将重新构建受影响的层和所有后续的层。这确保新的更改在生成的镜像中正确反映出来。在使用 Docker 时,需要注意这种缓存行为,以确保你的更改在构建过程中得到正确应用。

由于 Dockerfile 指令的当前顺序,构建器必须重新下载 Go 模块,尽管自上次构建以来没有任何包发生更改。

更新指令顺序(Update the instruction order)

你可以通过重新排列Dockerfile中的指令来避免这种冗余。将指令的顺序更改为在将源代码复制到容器之前下载和安装依赖项。这样,构建器可以从缓存中重用"dependencies"层,即使你对源代码进行了更改。

Go使用两个文件,称为go.mod和go.sum,来跟踪项目的依赖关系。这些文件对于Go来说就像package.json和package-lock.json对于JavaScript一样重要。为了让Go知道要下载哪些依赖项,你需要将go.mod和go.sum文件复制到容器中。在运行`RUN go mod download`之前添加另一个`COPY`指令,这次只复制go.mod和go.sum文件。

现在,如果你编辑了源代码,构建镜像不会导致构建器每次都下载依赖项。`COPY . .` 指令出现在包管理指令之后,因此构建器可以重用 `RUN go mod download` 层。

总结(Summary)

正确地排序你的DockerFile指令 会帮你在构建时避免不必要的工作。

相关信息:

相关推荐
小白&1238 分钟前
Linux-CentOS 7安装
linux·运维·服务器
土豆沒加40 分钟前
ubuntu22.04使用minikube安装k8s
云原生·容器·kubernetes
心随_风动1 小时前
CentOS 下安装和配置 HTTPD 服务的详细指南
linux·运维·centos
信阳农夫1 小时前
centos 7只能安装到3.6.8
linux·运维·centos
猫吃了源码2 小时前
KubeKey一键安装部署k8s集群和KubeSphere详细教程
云原生·容器·kubernetes
你可以叫我仔哥呀2 小时前
k8s学习记录:环境搭建(基于Kubeadmin)
学习·容器·kubernetes
TT-Kun2 小时前
Linux | 进程控制(进程终止与进程等待)
linux·运维·服务器
...:...:...2 小时前
Linux 第三次脚本作业
linux·运维·服务器
容器魔方3 小时前
KubeEdge社区2025年需求征集
云原生·容器·云计算
Abdullah al-Sa4 小时前
Docker教程(喂饭级!)
c++·人工智能·docker·容器