我想使用 shell 脚本输出作为 makefile 变量的输入,并将其作为 docker 构建中的构建参数传递

I want to use shell script output as a input to the makefile variable and pass that as the build parameter in docker build

makefile 如下所示

BASE_JOB_IMAGE := $(shell ./fetchimageversion.sh >> image.txt)
FILE ?= image.txt
BASE_JOB_IMAGE_NAME=`cat $(FILE)`


docker build \
    --pull \
    --no-cache \
    -t ${APPLICATION}_${TF_VER} \
    --build-arg baseimage=$(BASE_JOB_IMAGE_NAME)

但是我在 travis 日志中没有得到预期的输出。

docker build \
    --pull \
    --no-cache \
    --build-arg baseimage=`cat image.txt` \

当用作 BASE_JOB_IMAGE := $(shell ./fetchimageversion.sh) 我确实看到了脚本的输出 输出但整个脚本执行结果设置为变量,这也导致 travis 日志中的错误 --build-arg baseimage= \ being blank

首先不能是makefile;你有一个没有食谱的目标。我假设 docker 命令在食谱中。请务必提供足够的示例以构成功能测试。

第二,当你运行 make你看到什么输出?当寻求帮助时,最好包括你输入的命令、你得到的输出(如果输出很多,至少显示错误和错误之前的几行),并解释你想要什么。您应该将其剪切并粘贴到您的问题中:不要使用屏幕截图,也不要 paraphrase/retype 它可能会引入可能完全改变可能问题的细微差异。

第三,为什么将输出写入静态文件,然后设置一个变量并在 makefile 的其余部分引用该变量?

四、为什么用?=来定义文件名?您希望允许环境变量覆盖文件名吗?如果您在上一个命令中写入静态文件名,那将不起作用。

第五,写文件的时候为什么要用append-to >>?如果该文件已经存在,这意味着您将在其中包含多行内容。

尝试像这样编写您的 makefile:

FILE = input.txt
BASE_JOB_IMAGE := $(shell ./fetchimageversion.sh >$(FILE))
BASE_JOB_IMAGE_NAME = `cat $(FILE)`

...rest of makefile...

如果这不起作用,请提供前两段中讨论的更多详细信息。

预计到达时间

但是,我不知道您为什么要付出额外的努力来写入文件。为什么不将输出保存在变量中?

BASE_JOB_IMAGE_NAME := $(shell ./fetchimageversion.sh)

...rest of makefile...