使用Makefile增量构建Docker图像层次结构
在我的一个项目中,我有几个基于彼此的Docker图像,因为我不需要每次都重建它的基本部分,只想以增量方式构建层次结构的上层 我通过Makefile构建图像。我这样做是因为我承认自己很懒,不想每次都手动输入整个使用Makefile增量构建Docker图像层次结构,docker,makefile,Docker,Makefile,在我的一个项目中,我有几个基于彼此的Docker图像,因为我不需要每次都重建它的基本部分,只想以增量方式构建层次结构的上层 我通过Makefile构建图像。我这样做是因为我承认自己很懒,不想每次都手动输入整个docker build命令。也因为我想避免在这个过程中犯错误 我现在想做的是使make能够检测是否必须重建Docker映像而不是Docker本身,因为对于后者,每次都必须将Docker构建上下文发送到Docker守护进程。该映像非常大,因为它基于ubuntu:xenial,因此“将构建上下
docker build
命令。也因为我想避免在这个过程中犯错误
我现在想做的是使make能够检测是否必须重建Docker映像而不是Docker本身,因为对于后者,每次都必须将Docker构建上下文发送到Docker守护进程。该映像非常大,因为它基于ubuntu:xenial,因此“将构建上下文发送到Docker守护程序”对于每个单独的Docker映像总是需要大量时间,与是否需要重建无关
如果make
能够检测到是否需要执行docker build
命令,这将大大有助于加快流程
因此,我想知道是否有方法让make
检测是否需要重建特定的Docker图像 假设:
- 您的docker图像名为
,dia
,dib
dic
- 它们各自的docker文件名为
,dockerfile.dia
,dockerfile.dib
dockerfile.dic
- 它们对应的构建目录是
,/dia.dir/
,/dib.dir/
/dic.dir/
取决于dia
/dia.dir/
取决于dib
中的文件/dib.dir/
和docker图像cuz
dia
取决于dic
中的文件/dic.dir/
和docker图像baz
dib
DOCKERIMAGES:=直径dib dic
标记:=$(patsubst%,.%标记,$(DockerAges))
diaDEPS:=foo-bar
dibDEPS:=cuz
dicDEPS:=baz
全部:$(标记)
$(标记):.%。标记:dockerfile.%
docker build-f$<-t$*$*.目录&&\
回显“$*图像生成”和\
触碰$@
定义DEPS_规则
.$(1).tag:$$(addprefix$(1).dir/,$$($(1)DEPS))
恩德夫
$(foreach d,$(dockrimages),$(eval$(调用DEPS_规则,$(d)))
.dib.tag:.dia.tag
.dic.tag:.dib.tag
清洁:
rm-f$(标签)
只有当docker文件发生更改,或者目录中的文件发生更改,或者docker映像发生更改时,才会重新生成docker映像。假设:
- 您的docker图像名为
,dia
,dib
dic
- 它们各自的docker文件名为
,dockerfile.dia
,dockerfile.dib
dockerfile.dic
- 它们对应的构建目录是
,/dia.dir/
,/dib.dir/
/dic.dir/
取决于dia
/dia.dir/
取决于dib
中的文件/dib.dir/
和docker图像cuz
dia
取决于dic
中的文件/dic.dir/
和docker图像baz
dib
DOCKERIMAGES:=直径dib dic
标记:=$(patsubst%,.%标记,$(DockerAges))
diaDEPS:=foo-bar
dibDEPS:=cuz
dicDEPS:=baz
全部:$(标记)
$(标记):.%。标记:dockerfile.%
docker build-f$<-t$*$*.目录&&\
回显“$*图像生成”和\
触碰$@
定义DEPS_规则
.$(1).tag:$$(addprefix$(1).dir/,$$($(1)DEPS))
恩德夫
$(foreach d,$(dockrimages),$(eval$(调用DEPS_规则,$(d)))
.dib.tag:.dia.tag
.dic.tag:.dib.tag
清洁:
rm-f$(标签)
只有当docker文件发生更改,或者目录中依赖的文件发生更改,或者依赖的docker图像发生更改时,才应重建docker图像,已更改。您可以尝试使用一个名为的小工具,该工具可以分析
DockerFile的结构,并在父映像更改时启用触发分层构建
例如,当dog
图像更改时,可以自动重建子图像
├── alpine-java
│ ├── bird
│ └── mammal
│ ├── cat
│ ├── dog
│ │ ├── dobermann
│ │ │ └── smaller-dobermann
│ │ ├── pitbull
│ │ └── labrador
│ └── horse
└── scratch
└── fish
dog
重建时的调用可以简单到:
$/docker-bakery-example> cd dog
$/dog> make build-major-all
...
// docker build of child images
...
$/dog> make push-major-all
下面是一个包含dockerfiles
和make
文件的示例,使用起来非常方便 您可以尝试使用一个名为的小工具来分析dockerfiles
的结构,并在父映像更改时触发层次结构构建
例如,当dog
图像更改时,可以自动重建子图像
├── alpine-java
│ ├── bird
│ └── mammal
│ ├── cat
│ ├── dog
│ │ ├── dobermann
│ │ │ └── smaller-dobermann
│ │ ├── pitbull
│ │ └── labrador
│ └── horse
└── scratch
└── fish
dog
重建时的调用可以简单到:
$/docker-bakery-example> cd dog
$/dog> make build-major-all
...
// docker build of child images
...
$/dog> make push-major-all
下面是一个包含dockerfiles
和make
文件的示例,使用起来非常方便 需要重建码头工人的标准是什么?(如果它只是一个时间戳比较,那么它很简单,否则,您可能会在配方中创建一个脚本来有条件地重建)。你需要提供更多的信息,以便有人能有效地帮助你。标准是使Docker重建Docker图像的任何一层。如果无需执行任何操作,则作为图像一部分的每个层都将从缓存中加载,而不是重建。在这种情况下,可以从缓存中拾取所有层,我希望make
能够跳过整个docker build命令。我不确定Docker如何检测层是否需要重建,以及是否不可避免地要将构建上下文发送到Docker守护进程。只是一个简短的免责声明:我对Docker本身一无所知。但是,话虽如此,我是否可以假设每个docker映像都位于自己的单独目录中,并且docker