Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Makefile增量构建Docker图像层次结构_Docker_Makefile - Fatal编程技术网

使用Makefile增量构建Docker图像层次结构

使用Makefile增量构建Docker图像层次结构,docker,makefile,Docker,Makefile,在我的一个项目中,我有几个基于彼此的Docker图像,因为我不需要每次都重建它的基本部分,只想以增量方式构建层次结构的上层 我通过Makefile构建图像。我这样做是因为我承认自己很懒,不想每次都手动输入整个docker build命令。也因为我想避免在这个过程中犯错误 我现在想做的是使make能够检测是否必须重建Docker映像而不是Docker本身,因为对于后者,每次都必须将Docker构建上下文发送到Docker守护进程。该映像非常大,因为它基于ubuntu:xenial,因此“将构建上下

在我的一个项目中,我有几个基于彼此的Docker图像,因为我不需要每次都重建它的基本部分,只想以增量方式构建层次结构的上层

我通过Makefile构建图像。我这样做是因为我承认自己很懒,不想每次都手动输入整个
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/
    中的文件
    cuz
    和docker图像
    dia
  • dic
    取决于
    /dic.dir/
    中的文件
    baz
    和docker图像
    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/
    中的文件
    cuz
    和docker图像
    dia
  • dic
    取决于
    /dic.dir/
    中的文件
    baz
    和docker图像
    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