我有一个运行docker
级服务的Makefile
RUN = docker-compose run $(ARGS) --rm serivce
.PHONY: shell
shell:
${RUN} /bin/sh
.PHONY: server
server:
$(eval ARGS=--service-ports) ${RUN}
server
任务需要设置其他参数(--service-ports
)才能启动容器。
仅将参数硬编码到RUN
中是行不通的,因为shell
也会发布端口,并且会失败(使server
运行)。
根据上下文指定参数ARGS
的惯用方式是什么?
$(eval ARGS=--service-ports)
有效,但是有“正确的方法”吗?
答案 0 :(得分:3)
eval
绝对不正确。如果有人运行make server shell
怎么办?现在shell
将设置该参数,因为eval
会全局重置它。
是否有某些原因您不能只写:
server:
$(RUN) --service-ports
?通常,如果您需要基于每个目标自定义的变量,则有两种选择:
您可以使用target-specific variables:
server: ARGS = --service-ports
server:
$(RUN)
或者您可以使用recursively-expanded variables:
server_ARGS = --service-ports
RUN = docker-compose run $($@_ARGS) --rm service
server:
$(RUN)
答案 1 :(得分:0)
我认为您可以将变量分成更多部分:
COMMAND = docker-compose run --rm $(ARGS)
CONTAINER = service
.PHONY: shell
shell:
${COMMAND} ${CONTAINER} /bin/sh
.PHONY: server
server:
${COMMAND} --service-ports ${CONTAINER}