docker 如何在makefile脚本中对env var进行字符串替换

jutyujz0  于 2022-12-26  发布在  Docker
关注(0)|答案(2)|浏览(176)

我有一个包含以下脚本的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脚本中执行字符串替换的正确方法是什么?

ogq8wdun

ogq8wdun1#

您可以直接使用subst function

CLEANED_IMAGE_BRANCH=$(subst /,-,$(IMAGE_BRANCH))

如果我运行这个Makefile

GITHUB_ACTOR=someuser
GITHUB_TOKEN=token
DOCKER_REGISTRY=ghcr.io
IMAGE_BRANCH=feature/a-b-c
IMAGE_TAG=foo

CLEANED_IMAGE_BRANCH=$(subst /,-,$(IMAGE_BRANCH))

build:
    echo 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 .

我得到的输出是:

echo DOCKER_BUILDKIT=1 docker build \
        --build-arg GITHUB_ACTOR=someuser \
        --build-arg GITHUB_TOKEN=token \
        -t ghcr.io/strick:feature-a-b-c-foo \
        -t ghcr.io/strick:feature-a-b-c-latest .
DOCKER_BUILDKIT=1 docker build --build-arg GITHUB_ACTOR=someuser --build-arg GITHUB_TOKEN=token -t ghcr.io/strick:feature-a-b-c-foo -t ghcr.io/strick:feature-a-b-c-latest .
osh3o9ms

osh3o9ms2#

首先,当您想将$传递给shell时,必须将其从make中转义,因为$对于make来说是特殊的。
其次,配方中的每一个逻辑行都在单独的shell中运行,因此如果希望在一行中设置的shell变量在另一行中可见,必须通过反斜杠将它们连接起来。

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 .

当然,使用make函数也是一个好主意,只要你愿意(或者已经承诺)使用GNU make。

相关问题