Make:依赖于docker映像

Make:依赖于docker映像,docker,makefile,Docker,Makefile,我使用docker工作流根据给定的规范文件生成一些文件,Makefile是(它根据OpenAPI规范生成客户端): 这可以很好地工作,如果我修改输入等级库文件,它将重建 但当docker映像更改时,它不会重建 假设我再次使用相同的name:tag构建图像,但内部代码不同,或者使用上游图像的不同标记版本,不管怎样。这是意料之中的,因为Makefile不知道docker映像的内容或修改日期。如何使Makefile理解对docker映像的依赖关系 我尝试了docker检查图像以获取创建日期,但我不知

我使用docker工作流根据给定的规范文件生成一些文件,Makefile是(它根据OpenAPI规范生成客户端):

这可以很好地工作,如果我修改输入等级库文件,它将重建

但当docker映像更改时,它不会重建

假设我再次使用相同的
name:tag
构建图像,但内部代码不同,或者使用上游图像的不同标记版本,不管怎样。这是意料之中的,因为Makefile不知道docker映像的内容或修改日期。如何使Makefile理解对docker映像的依赖关系

  • 我尝试了
    docker检查
    图像以获取创建日期,但我不知道如何使
    make
    将其理解为依赖项(如果创建日期比输出目录新,则重新生成)
  • 我不能仅仅在docker映像中添加对代码的依赖,因为docker映像甚至可能不是从本地可用的文件构建的

make
可能不是这类东西的工具,也许我可以使用其他东西来理解docker映像的依赖性。

无论您依赖的工件是docker映像还是其他地方的某些服务/数据,您都需要表示您对它的了解,以常规文件的形式。因为只处理文件。:-)

我建议您为“调用
docker build
定义一些宏,并将其成功的证据保存到具有可预测名称的标记文件中,以便您可以使用该宏替换对
docker build
的所有调用,确保一致的文件处理。完整示例,假设存在
a/Dockerfile
b/Dockerfile

# For consistency, the src dirs are named like the images they produce
IMAGES = a b

# Keep "stamps" around, recording that images were built. 
# You could keep them in e.g. a `.docker-buildstamps/*` dir, 
# but this example uses `*/docker-buildstamp`.
BUILDSTAMP_FILE = docker-buildstamp
BUILDSTAMPS = $(addsuffix /$(BUILDSTAMP_FILE),$(IMAGES))

.PHONY: all
all: $(BUILDSTAMPS)

# Pattern rule: let e.g. `a/docker-buildstamp` depend on changes to `a/*` (-but avoid circular dep)
%/$(BUILDSTAMP_FILE): % %/[!$(BUILDSTAMP_FILE)]*
    $(docker_build)

clean:
    docker image rm -f $(IMAGES)
    rm -f $(BUILDSTAMPS)

# Turn `a/docker-buildstamp` back into `a`
define from_buildstamp
$(@:%/$(BUILDSTAMP_FILE)=%)
endef

# Self-explanatory
define docker_build
docker build -t $(from_buildstamp) $(from_buildstamp) 
touch $@
endef

无论您所依赖的工件是Docker映像还是其他地方的某些服务/数据,您都需要以常规文件的形式表示您对它的了解。因为只处理文件。:-)

我建议您为“调用
docker build
定义一些宏,并将其成功的证据保存到具有可预测名称的标记文件中,以便您可以使用该宏替换对
docker build
的所有调用,确保一致的文件处理。完整示例,假设存在
a/Dockerfile
b/Dockerfile

# For consistency, the src dirs are named like the images they produce
IMAGES = a b

# Keep "stamps" around, recording that images were built. 
# You could keep them in e.g. a `.docker-buildstamps/*` dir, 
# but this example uses `*/docker-buildstamp`.
BUILDSTAMP_FILE = docker-buildstamp
BUILDSTAMPS = $(addsuffix /$(BUILDSTAMP_FILE),$(IMAGES))

.PHONY: all
all: $(BUILDSTAMPS)

# Pattern rule: let e.g. `a/docker-buildstamp` depend on changes to `a/*` (-but avoid circular dep)
%/$(BUILDSTAMP_FILE): % %/[!$(BUILDSTAMP_FILE)]*
    $(docker_build)

clean:
    docker image rm -f $(IMAGES)
    rm -f $(BUILDSTAMPS)

# Turn `a/docker-buildstamp` back into `a`
define from_buildstamp
$(@:%/$(BUILDSTAMP_FILE)=%)
endef

# Self-explanatory
define docker_build
docker build -t $(from_buildstamp) $(from_buildstamp) 
touch $@
endef

你的问题还不清楚。发布Make项目结构和Makefile。您是否尝试过使用
docker run--无缓存
选项?@MikeKinghan我已将实际的Makefile概括地复制了问题,将docker映像的ID保存到一个文件并进行比较。@mulg0r您的意思是
docker build--无缓存?
,您的问题情况尚不清楚。发布Make项目结构和Makefile。您是否尝试过使用
docker run--无缓存
选项?@MikeKinghan我已经将实际的Makefile复制了这个问题概括起来,将docker映像的ID保存到一个文件中并进行比较。@mulg0r您的意思是
docker build--无缓存?