惯用的Makefile和命令参数

时间:2019-03-20 20:32:58

标签: docker makefile docker-compose gnu-make

上下文

我有一个运行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)有效,但是有“正确的方法”吗?

2 个答案:

答案 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}