考虑以下makefile片段:
COMMIT := $(shell git rev-parse HEAD)
build:
docker build -f Dockerfile --no-cache=false -t $(COMMIT) .
rebuild:
docker build -f Dockerfile --no-cache=true -t $(COMMIT) .
build
和rebuild
之间的唯一区别是--no-cache
参数的值。显然,略微改变重写相同的命令是一种不好的做法;它打破了DRY原则,如果我需要在命令中更改其他内容 - 例如-t
的值 - 我将不得不在所有相关目标中更改它。
我有这样的想法:
COMMIT := $(shell git rev-parse HEAD)
NO_CACHE := false
build:
docker build -f Dockerfile --no-cache=$(NO_CACHE) -t $(COMMIT) .
rebuild:
NO-CACHE = true
make build
我试着玩变量,没有运气。
一次编写docker build
命令并让每个目标改变其参数的优雅方法是什么?
答案 0 :(得分:6)
您可以使用constructed variable names:
COMMIT := $(shell git rev-parse HEAD)
build_NOCACHE = false
rebuild_NOCACHE = true
build rebuild:
docker build -f Dockerfile --no-cache=$($@_NOCACHE) -t $(COMMIT) .
或者您可以使用target-specific variables:
COMMIT := $(shell git rev-parse HEAD)
build: NOCACHE = false
rebuild: NOCACHE = true
build rebuild:
docker build -f Dockerfile --no-cache=$(NOCACHE) -t $(COMMIT) .
答案 1 :(得分:0)
位置参数从1到n指定,并在命令定义中用作$(1)
,$(2)
,$(n)
。
COMMIT := $(shell git rev-parse HEAD)
DOCKER_BUILD_CMD = docker build -f Dockerfile --no-cache=$(1) -t $(COMMIT) .
build:
$(call DOCKER_BUILD_CMD, false)
rebuild:
$(call DOCKER_BUILD_CMD, true)