我正在使用Makefile来运行各种Docker -compose命令,我正在尝试捕获在本地机器上运行的脚本的输出,并将该值传递给Docker映像。
start-service:
VERSION=$(shell aws s3 ls s3://redact/downloads/1.2.3/) &&
docker-compose -f ./compose/docker-compose.yml run
-e VERSION=$$(VERSION)
connect make run-service
当我运行这个,我可以看到变量被分配,但它仍然错误。为什么值没有被传递到-e参数中:
VERSION=1.2.3-build342 &&
docker-compose -f ./compose/docker-compose.yml run --rm
-e VERSION?=$(VERSION)
connect make run-connect
/bin/sh: VERSION: command not found
您在这里混合了几种不同的Bourne shell和Make语法。Make$$(VERSION)
转换为shell$(VERSION)
,这是命令替换语法;GNU Make$(shell ...)
通常在错误的时间扩展,这不是您想要的。
如果你把它写成一个普通的shell命令,它看起来就像
# Set VERSION using $(...) substitution syntax
# Refer to just plain $VERSION
VERSION=$(aws s3 ls s3://redact/downloads/1.2.3/) && ...
-e VERSION=$VERSION ...
所以当你在Make上下文中使用它时,如果没有一个变量是Make变量(它们在同一个命令中被设置和使用),只需将$
加倍到$$
,而不是转义它们。
start-service:
VERSION=$$(aws s3 ls s3://redact/downloads/1.2.3/) &&
docker-compose -f ./compose/docker-compose.yml run
-e VERSION=$$VERSION
connect make run-service