gpt4 book ai didi

makefile - 构建具有多个目标的多个文件

转载 作者:行者123 更新时间:2023-12-02 00:54:55 25 4
gpt4 key购买 nike

我有一个包含多个 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))))

最佳答案

我不确定这是你想要的,但是......

首先考虑BUILD 变量。如果我们有三个 Dockerfile:

foo/Dockerfile
bar/Dockerfile
baz/Dockerfile

然后我们希望 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

粗糙但有效。

现在是规则。通常,规则的目标是规则构建的文件的名称。在这种情况下,我们必须打破这个约定,因为我们不知道图像文件的名称是什么。因此,如果目录是 foo/,我们可以有一个名为 build_foo 的规则:

build_foo:
@echo "Building foo"
@echo docker build -t foo --force-rm foo

由于我们不想为每个可能的目录编写规则,我们将使用自动变量并创建一个 pattern rule :

build_%:
@echo "Building $$@"
@echo docker build -t $* --force-rm $*

现在 "make build_foo 将正常工作。我们可以编写一个 build` 规则来构建所有这些:

build: $(addprefix build_,$(BUILDS))

但这不是完全正确的方法。我们希望按此顺序构建、测试、推送每个镜像。所以我们想要这样的东西:

push_foo: test_foo

test_foo: build_foo

我们可以用模式规则来做到这一点:

test_%: build_%
...

push_%: test_%
...

release: $(addprefix push_,$(BUILDS))

现在“make release”会做所有事情。 (如果您将 release: 作为 makefile 中的第一条规则,它将成为默认规则,“make”就足够了。)

关于makefile - 构建具有多个目标的多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36556411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com