从make中的变量运行命令

时间:2017-01-28 15:09:27

标签: windows makefile

我正在运行make for windows。 (choco install make

在我尝试构建一个docker容器,特别是在Amazon ECS上进行部署之前,几乎一切都运行正常....

ECS部署过程的一部分是您从AWS获得登录 aws ecr get-login 这将返回一个包含看起来像的命令的字符串 docker login -u AWS -p AQEC...HGZSSUMX4ftIpo8gY2 -e none https://123456789.dkr.ecr.us-east-1.amazonaws.com

如果我只是从shell运行它我将复制输出并将其传递到命令行并运行 - 但我正在尝试将其放入我的makefile中,所以我有 @ECS_LOGIN =$(shell aws ecr get-login)

然后我试图在下一行执行它 $(ECS_LOGIN)

那就是我得到的地方 process_begin: CreateProcess(NULL, ECS_LOGIN =docker login -u AWS -p AQEC...HGZSSUMX4ftIpo8gY2 -e none https://123456789.dkr.ecr.us-east-1.amazonaws.com, ...) failed. make (e=2): The system cannot find the file specified. make: *** [docker-deploy] Error 2

从研究其他问题时,这似乎是从Windows运行时的一个路径问题 Makefile error make (e=2): The system cannot find the file specified

但我的aws ecr get-login之前的docker命令工作正常 即
docker build
所以它似乎特定于从变量

中运行命令

那么如何从make运行此命令并解析路径?

完整食谱
docker-deploy: docker-build @ECS_LOGIN =$(shell aws ecr get-login) $(ECS_LOGIN) docker tag mytag:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/mytag:latest docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/mytag:latest

2 个答案:

答案 0 :(得分:3)

首先,您需要决定使用哪个工具来运行" aws ecr get-login"命令。在你的食谱中,Make运行它(并且你将结果分配给一个shell变量而不引用多字值,但我想Windows shell可以用它吗?)。在下一行中,您尝试引用 shell 变量,但忘记美元引用美元符号,因此在调用配方时可以替换ECS_LOGIN的值(可能是没有)。

或许首先将第一行(ECS_LOGIN=$(shell aws ecr get-login))移出shell配方,看看是否有帮助:

ECS_LOGIN =$(shell aws ecr get-login)
docker-deploy: docker-build
    @$(ECS_LOGIN)
    docker tag mytag:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/mytag:latest
    docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/mytag:latest

答案 1 :(得分:0)

你的makefile对make变量和shell变量以及如何调用配方感到困惑;看到迈克尔的答案。

如果是我,我根本不会费心去使用变量;你有没有理由这样做?

你可以使用:

docker-deploy: docker-build
        @$(shell aws ecr get-login)
        docker tag mytag:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/mytag:latest
        docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/mytag:latest

哪个会起作用但有点奇怪:在配方中运行shell函数会让人感到困惑,因为你已经在shell中,所以另一种选择就是完全使用配方shell并避免使用make { {1}}功能:

shell