gpt4 book ai didi

docker - 使用Makefile逐步构建Docker镜像层次结构

转载 作者:行者123 更新时间:2023-12-02 20:49:04 31 4
gpt4 key购买 nike

在我的一个项目中,我有几个相互依赖的Docker镜像,因为我不需要每次都重新构建它的基本部分,而只想逐步构建层次结构的上层。

我通过Makefile构建图像。我这样做是因为我很懒,不想每次都手动输入整个docker build命令。同时也因为我想避免在此过程中犯错误。

我现在想做的是使make能够检测是否必须重建Docker镜像而不是Docker本身,因为对于Docker而言,每次必须将Docker构建上下文发送到Docker守护程序。该镜像非常大,因为它基于ubuntu:xenial,因此“将构建上下文发送到Docker守护程序”对于每个单独的Docker镜像始终花费大量时间,而与是否需要重建它们无关。

如果make能够检测到是否需要执行docker build命令,则将大大有助于加快该过程。

所以我想知道make是否有办法检测是否需要重建特定的Docker镜像。

最佳答案

假设:

  • 您的Docker镜像名为diadibdic ...
  • 它们各自的docker文件名为dockerfile.diadockerfile.dibdockerfile.dic ...
  • 它们对应的构建目录是./dia.dir/./dib.dir/./dic.dir/ ...
  • dia取决于foo中的文件bar./dia.dir/
  • dib取决于cuz中的文件./dib.dir/和docker镜像dia
  • dic取决于baz中的文件./dic.dir/和docker镜像dib

  • 您可以尝试类似(未经测试)的方法:
    DOCKERIMAGES := dia dib dic
    TAGS := $(patsubst %,.%.tag,$(DOCKERIMAGES))
    diaDEPS := foo bar
    dibDEPS := cuz
    dicDEPS := baz

    all: $(TAGS)

    $(TAGS): .%.tag: dockerfile.%
    docker build -f $< -t $* $*.dir && \
    echo '$* image built' && \
    touch $@

    define DEPS_rule
    .$(1).tag: $$(addprefix $(1).dir/,$$($(1)DEPS))
    endef

    $(foreach d,$(DOCKERIMAGES),$(eval $(call DEPS_rule,$(d))))

    .dib.tag: .dia.tag
    .dic.tag: .dib.tag

    clean:
    rm -f $(TAGS)

    仅当 docker 镜像更改,泊坞目录中所依赖的文件或泊坞镜像所依赖时,才应重建泊坞镜像。

    关于docker - 使用Makefile逐步构建Docker镜像层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44969605/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com