Make:对Docker映像的依赖

时间:2019-02-15 08:54:07

标签: docker makefile

我正在使用docker工作流基于给定的spec文件生成一些文件,其中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映像的依赖性。

1 个答案:

答案 0 :(得分:0)

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

我建议您为“invoke docker build 将成功的证据保存到具有可预测名称的标记文件”定义一些宏 以便您可以使用它来替换对 docker build 的所有调用,确保一致的文件处理。完整示例,假设 a/Dockerfileb/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