Make:对 docker 镜像的依赖

2024-02-11

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

SWAGGER ?= ${PWD}/swagger.yaml
GENERATOR ?= openapitools/openapi-generator-cli\:latest

generated: Makefile ${SWAGGER}
    docker run --rm --user $$(id -u):$$(id -g) \
    -v ${PWD}:/output -v ${SWAGGER}:/input/swagger.yaml \
    ${GENERATOR} \
    generate -g python -i /input/swagger.yaml -o /output/generated \

这工作正常,如果我修改输入 SPEC 文件,将会重建。

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

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

  • 我尝试过docker inspect用于获取创建日期的图像,但我不知道如何制作make将其理解为依赖项(如果创建日期比输出目录新,则重建)
  • 我不能只添加对 docker 映像内代码的依赖项,因为 docker 映像甚至可能不是从本地可用文件构建的。

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


无论您依赖的工件是 Docker 镜像还是其他地方的某些服务/数据,您都需要表示什么you了解它,以常规文件。因为make https://www.gnu.org/software/make/manual/make.html只处理文件。 :-)

我建议你定义一些宏"invoke docker build and将其成功的证据保存到标记文件中可预测的名字"这样您就可以用它来替换对的所有调用docker build,确保一致的文件处理。完整的例子,假设a/Dockerfile and b/Dockerfile exist.

# 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Make:对 docker 镜像的依赖 的相关文章

随机推荐