我正在运行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
答案 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