我有一个包含以下脚本的makefile:
build:
DOCKER_BUILDKIT=1 docker build --build-arg GITHUB_ACTOR=${GITHUB_ACTOR} --build-arg GITHUB_TOKEN=${GITHUB_TOKEN} -t ${DOCKER_REGISTRY}/strick:${IMAGE_BRANCH}-${IMAGE_TAG} -t ${DOCKER_REGISTRY}/strick:${IMAGE_BRANCH}-latest .
我刚刚意识到当${IMAGE_BRANCH]
中有一个斜线时,比如feature/a-b-c
,那么docker构建步骤将失败。我想创建一个新的env变量,用破折号替换IMAGE_BRANCH
中的斜线。
我尝试了几种变体,包括
build:
CLEANED_IMAGE_BRANCH=$(echo ${IMAGE_BRANCH} | sed 's/\//-/g')
DOCKER_BUILDKIT=1 docker build --build-arg GITHUB_ACTOR=${GITHUB_ACTOR} --build-arg GITHUB_TOKEN=${GITHUB_TOKEN} -t ${DOCKER_REGISTRY}/strick:${CLEANED_IMAGE_BRANCH}-${IMAGE_TAG} -t ${DOCKER_REGISTRY}/strick:${CLEANED_IMAGE_BRANCH}-latest .
它们看起来都失败了,因为CLEANED_IMAGE_BRANCH
最后变成了空字符串。
❮❮❮ DOCKER_REGISTRY=docker IMAGE_BRANCH="a/b" IMAGE_TAG="lol" make build
CLEANED_IMAGE_BRANCH=
DOCKER_BUILDKIT=1 docker build --build-arg GITHUB_ACTOR= --build-arg GITHUB_TOKEN= -t docker/strick:-lol -t docker/strick:-latest .
invalid argument "docker/strick:-lol" for "-t, --tag" flag: invalid reference format
See 'docker build --help'.
make: *** [build] Error 125
在makefile脚本中执行字符串替换的正确方法是什么?
2条答案
按热度按时间ogq8wdun1#
您可以直接使用
subst
function:如果我运行这个
Makefile
:我得到的输出是:
osh3o9ms2#
首先,当您想将
$
传递给shell时,必须将其从make中转义,因为$
对于make来说是特殊的。其次,配方中的每一个逻辑行都在单独的shell中运行,因此如果希望在一行中设置的shell变量在另一行中可见,必须通过反斜杠将它们连接起来。
当然,使用make函数也是一个好主意,只要你愿意(或者已经承诺)使用GNU make。