#docker #makefile #docker-compose #gnu-make
#docker #makefile #docker-создать #gnu-make
Вопрос:
Контекст
У меня есть Makefile для запуска docker
-модифицированной службы
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)
работает, но есть ли «правильный способ»?
Ответ №1:
eval
Это определенно неправильно. Что, если кто-то запустится make server shell
? Теперь у shell
будет установлен этот аргумент, потому что eval
он сбрасывается глобально.
Есть ли какая-то причина, по которой вы не можете просто написать:
server:
$(RUN) --service-ports
? В общем, если вам нужна переменная, настроенная для каждой цели, у вас есть два варианта:
Вы можете использовать целевые переменные:
server: ARGS = --service-ports
server:
$(RUN)
Или вы можете использовать рекурсивно расширяемые переменные:
server_ARGS = --service-ports
RUN = docker-compose run $($@_ARGS) --rm service
server:
$(RUN)
Ответ №2:
Я думаю, вы могли бы просто разделить свои переменные на большее количество частей:
COMMAND = docker-compose run --rm $(ARGS)
CONTAINER = service
.PHONY: shell
shell:
${COMMAND} ${CONTAINER} /bin/sh
.PHONY: server
server:
${COMMAND} --service-ports ${CONTAINER}