Makefile 将 bash 命令中的变量转义到 Docker 容器

问题描述 投票:0回答:1

我想在 Docker 容器中使用

env
变量。
通过使用
Makefile

该变量仅存在于 Docker 容器中。

我写了一个

Makefile
用于在 CICD 管道中重用代码。
但我在传递变量的正确转义方面遇到问题。

生成文件

execute:
    @echo $(COMMAND)
    docker exec -it my-dev-container $(COMMAND)

Makefile 结果为空

$ make execute COMMAND="bash -c 'echo $VARIABLE_ONLY_EXIST_IN_CONTAINER'"
bash -c echo
<< EMPTY >>

Makefile 的预期结果:

$ make execute COMMAND="bash -c 'echo $VARIABLE_ONLY_EXIST_IN_CONTAINER'"
I_AM_A_VARIABLE_VALUE_WITHIN_THE_CONTAINER

无需Makefile即可工作:

docker exec -it my-dev-container bash -c 'echo $VARIABLE_ONLY_EXIST_IN_CONTAINER'  
I_AM_A_VARIABLE_VALUE_WITHIN_THE_CONTAINER

有什么想法如何正确转义字符串吗?

docker makefile escaping
1个回答
0
投票

Make 变量是简单的字符串,Make 没有任何方法来转义多单词字符串,以便可以安全地传递到 shell 上下文。为了使其像您所展示的那样工作,您需要在主机 shell 中转义字符串,以便 Make 接收运行子命令所需的字符串。

在您的设置中,您需要

COMMAND
才能获得该值

bash -c 'echo $V'

其中单引号和美元符号是字符串的一部分。当您输入

make
时,您需要在主机上引用此内容(尤其是美元符号):

make execute COMMAND="bash -c 'echo \$V'"

您在这里似乎没有使用 Make 作为构建系统,并且您显示的片段并不建议依赖于任何其他构建规则。仅运行您所展示的

docker exec
命令(或者更好的是,独立的
docker run
命令),或者使用一些其他技术(例如包装器工具的 shell 脚本)可能会更简单。

© www.soinside.com 2019 - 2024. All rights reserved.