我遇到的问题是all
目标依赖于设置变量的其他目标,然后运行匹配的依赖项。
结果- 它将运行第一个依赖项然后停止。
预期- 运行两个依赖项,在每次运行之间正确设置变量
是否make
足够聪明,可以看到pull
并且build
已经运行并且依赖目标本身没有执行,因此它认为所有依赖都是完整的?还是我只是make
以不应该使用的方式滥用?
说makefile
:
repo=rippio
image=default
pull:
@docker pull $(repo)/$(image):latest
build: pull
@sed -e 's/{{repo}}/$(repo)/' -e 's/{{image}}/$(image)/' Dockerfile.in > Dockerfile && \
docker build -t=$(repo)/$(image):custom .
@rm -f Dockerfile
node: image=node
node: | pull build
jdk8: image=jdk8
jdk8: | pull build
all: | node jdk8
TLDR
它用于:
- 拉取最新的 docker 镜像
- 对它运行一个通用设计的 Dockerfile 来定制它
- 将其标记为 :custom 供内部使用
以通用方式自定义图像非常方便,无需管理许多Dockerfiles
.
Dockerfile 模板 ( Dockerfile.in
),如果有兴趣:
FROM {{repo}}/{{image}}:latest
... super secret sauce
更新(答案)
感谢@GM,最终得到:
IMAGE_NAMES := node jdk8
TARGETS := $(patsubst %,build-%,$(IMAGE_NAMES))
repo=rippio
all: $(TARGETS)
build-%: pull-%
@$sed -e 's/{{repo}}/$(repo)/' -e 's/{{image}}/$*/' Dockerfile.in > Dockerfile-$* && \
$docker build -f=Dockerfile-$* -t=$(repo)/$*:custom .
@rm -f Dockerfile-$*
pull-%:
@$docker pull $(repo)/$*:latest
这允许:
- 轻松维护不断增长的“所有”目标
- 通过并行运行
make -j
(注意Dockerfile-$*
文件模式) - 比以前漂亮多了