2017-01-28 2 views
0

Ich bin für Windows ausführen. (choco install make)Ausführen eines Befehls von einer Variablen in make

ziemlich alles ausarbeitet gut, bis ich versuche, einen Docker Container zu bauen, die speziell auf Amazon ECS ....

Ein Teil des ECS bereitstellen Prozess zu implementieren ist, dass Sie einen Login erhalten von AWS aws ecr get-login gibt diese eine Zeichenfolge, die einen Befehl enthält, der diese, wenn ich aus der Schale gerade lief wie docker login -u AWS -p AQEC...HGZSSUMX4ftIpo8gY2 -e none https://123456789.dkr.ecr.us-east-1.amazonaws.com

sieht i die Ausgabe und an ihm vorbei auf die Kommandozeile und führen würde kopieren - aber ich versuche zu setze das in mein Makefile, also habe ich @ECS_LOGIN =$(shell aws ecr get-login)

und dann versuche ich es auf der nächsten Zeile $(ECS_LOGIN)

und das ist auszuführen, wo ich
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

von der Erforschung anderer Fragen dies scheint wie eine Wegfindung Problem bekommen, wenn sie von Windows ausgeführt wird Makefile error make (e=2): The system cannot find the file specified

aber docker Befehle vor meiner aws ecr get-login gut funktionieren dh 012.380. docker build
so scheint es spezifisch den Befehl aus dem variablen

So zu laufen, wie führe ich diesen Befehl von make und haben den Weg lösen?

vollständige Rezept
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

Antwort

3

Zuerst müssen Sie entscheiden, welches Werkzeug Sie verwenden möchten, die "aws ecr get-login" Befehl auszuführen. In Ihrem Rezept führt Make es aus (und Sie weisen das Ergebnis einer Shell-Variablen zu, ohne den Mehrwortwert anzugeben, aber ich denke, die Windows-Shell ist in Ordnung?). In der nächsten Zeile versuchen Sie, auf die Shell Variable zu verweisen, aber vergessen Sie nicht, das Dollarzeichen zu zitieren, also ersetzen Sie den Wert von ECS_LOGIN zum Zeitpunkt des Aufrufs des Rezepts (was wahrscheinlich nichts ist).

Vielleicht starten, indem Sie die erste Zeile zu bewegen (ECS_LOGIN=$(shell aws ecr get-login)) aus der Schale Rezepts und sehen, ob das hilft:

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

danke - Putting die Variable gesetzt außerhalb des Rezepts schien den Trick zu tun –

0

Ihre Make-Datei zu Variablen vs. Shell-Variablen zu machen ist verwirrt und wie Rezepte aufgerufen werden; Siehe Michaels Antwort.

Wenn ich es wäre, würde ich einfach keine Variable benutzen; Gibt es einen Grund, warum du das willst?

könnten Sie entweder:

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 

, die arbeiten, aber ein wenig seltsam ist: läuft eine shell Funktion in einem Rezept verwirrend ist, weil Sie bereits in einer Schale sind, so eine Alternative ist nur zu Verwenden Sie die Rezept Shell komplett und vermeiden Sie Make's shell Funktion:

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 
Verwandte Themen