2017-01-28 1 views
0

Я запускаю make для окон. (choco install make)Запуск команды из переменной в 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

, если я просто работаю это из оболочки я бы скопировать выход и мимо него на командную строку и запустить - но я пытаюсь поместите это в мой 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

от исследования других вопросов, это кажется как вопрос Pathing при запуске из окон Makefile error make (e=2): The system cannot find the file specified

но команды докер до моего aws ecr get-login работы просто отлично т.е.
docker build
так что кажется, специфичен для запуска команды из переменных

Так как я запустить эту команду из замыкающих и есть путь решительность?

полный рецепт
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

ответ

3

Во-первых, вы должны решить, какой инструмент вы хотите использовать, чтобы запустить «AWS ECR получить логином» команду. В вашем рецепте Make запускает его (и вы назначаете результат переменной оболочки без цитирования значения многословного слова, но я полагаю, что оболочка Windows в порядке с ней?). В следующей строке вы пытаетесь сослаться на переменную , но забудьте знак доллара и знак доллара, поэтому замените любое значение ECS_LOGIN во время вызова рецепта (что, вероятно, ничего).

Возможно начать перемещение первой линии (ECS_LOGIN=$(shell aws ecr get-login)) из рецепта оболочки и посмотреть, если это помогает:

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 
+0

спасибо - положив переменную, установленную вне рецепта, казалось, сделал трюк –

0

Ваш Makefile путается о переменных сделать vs. переменных оболочки и как рецепты вызываются; см. ответ Майкла.

Если бы это был я, я бы просто не стал использовать переменную вообще; есть ли причина, по которой вы хотите это сделать?

Вы могли бы использовать:

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 от make:

docker-deploy: docker-build 
     @eval $$(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 
Смежные вопросы