【发布时间】:2016-04-16 15:28:53
【问题描述】:
我有一个包含多个 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))))
【问题讨论】:
-
我对docker不熟悉。如果我有
foo/Dockerfile并执行docker build -t foo --force-rm foo,它会生成一个文件吗?如果是这样,该文件的名称是什么?它位于何处? -
您好 Beta,图像(文件)位于 docker 主机上,取决于使用的存储驱动程序。 stackoverflow.com/questions/19234831/…
-
你的意思是一般情况下你不知道文件会去哪里或者叫什么名字吗?在这种情况下,有效 makefile 很容易,但有效 则不然。
-
我的意思是 makefile 不应该依赖于特定的 docker 配置。主机可以在远程机器上,并且可以使用多个存储驱动程序。 docker build 可以使用目录名称' -t ${PWD##*/} '标记图像。 docker run 和 push 也可以引用目录名。
标签: makefile gnu-make dockerfile