Tom*_*Tom 2 makefile gnu-make dockerfile
我有一个包含多个 Dockerfile 的项目,每个文件都位于我用作 Docker 映像标签的命名目录中。我需要为每个 Dockerfile 构建、测试和推送每个 docker 映像。我需要做什么才能使用 GNU Make 进行如下工作?
# BUILDS needs to be a list of directories, not a list of Dockerfiles
BUILDS := $(wildcard */Dockerfile)
VERSION := $(shell git rev-parse --short=12 --verify HEAD)
DOCKER_REPO_URL := quay.io/reponame
define docker_build =
$(1):
@echo "Building $$@"
docker build -t $$@ --force-rm $$@
endef
define docker_test =
$(1):
@echo "Testing $$@"
docker inspect $$@
docker run --rm $$@ help
endef
define docker_push =
$(1):
@echo "Pushing $$@"
docker tag $$@ $(DOCKER_REPO_URL):$$@-$(VERSION)
docker push $(DOCKER_REPO_URL):$$@-$(VERSION)
docker tag $$@ $(DOCKER_REPO_URL):$$@
docker push $(DOCKER_REPO_URL):$$@
endef
.PHONY: all build test release clean
all: build test release
build: $(BUILDS)
$(foreach build,$(BUILDS),$(eval $(call docker_build,$(build))))
test: $(BUILDS)
$(foreach test,$(BUILDS),$(eval $(call docker_test,$(test))))
release:
$(foreach image,$(BUILDS),$(eval $(call docker_push,$(image))))
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是您想要的,但是...
首先考虑BUILD变量。如果我们有三个 Dockerfile:
foo/Dockerfile
bar/Dockerfile
baz/Dockerfile
Run Code Online (Sandbox Code Playgroud)
那么我们想要BUILDS包含foo bar baz
以下是一些尝试:
BUILDS := $(wildcard */Dockerfile) # this is foo/Dockerfile bar/Dockerfile baz/Dockerfile
BUILDS := $(dir $(wildcard */Dockerfile)) # this is foo/ bar/ baz/
BUILDS := $(patsubst %/,%, $(dir $(wildcard */Dockerfile))) # this is foo bar baz
Run Code Online (Sandbox Code Playgroud)
粗暴但有效。
现在规则。通常,规则的目标是规则构建的文件的名称。在这种情况下,我们必须打破这个约定,因为我们不知道图像文件的名称是什么。因此,如果目录是foo/,我们可以有一个名为 的规则build_foo:
build_foo:
@echo "Building foo"
@echo docker build -t foo --force-rm foo
Run Code Online (Sandbox Code Playgroud)
由于我们不想为每个可能的目录编写规则,因此我们将使用自动变量并创建模式规则:
build_%:
@echo "Building $$@"
@echo docker build -t $* --force-rm $*
Run Code Online (Sandbox Code Playgroud)
现在“make build_foo will work correctly. And we could write abuild`规则构建所有这些:
build: $(addprefix build_,$(BUILDS))
Run Code Online (Sandbox Code Playgroud)
但这并不是正确的做法。我们想要按照这个顺序构建、测试、然后推送每个图像。所以我们想要这样的东西:
push_foo: test_foo
test_foo: build_foo
Run Code Online (Sandbox Code Playgroud)
我们可以使用模式规则来做到这一点:
test_%: build_%
...
push_%: test_%
...
release: $(addprefix push_,$(BUILDS))
Run Code Online (Sandbox Code Playgroud)
现在“make release”将完成一切。(如果你把release:第一个规则放在 makefile 中,它将成为默认规则,“make”就足够了。)
| 归档时间: |
|
| 查看次数: |
1597 次 |
| 最近记录: |