2017-02-02 4 views
6

Ich versuche, zwei Befehle in Docker Exec auszuführen. Konkret muss ich einen Befehl in einem bestimmten Verzeichnis ausführen. Ich versuchte dies, butit hat nicht funktioniert:Ausführen von zwei Befehlen mit Docker exec

docker exec [id] -c 'cd /var/www/project && composer install' 

Parameter -c nicht erkannt wird. Ich habe auch versucht dies:

docker exec [id] cd /var/www/project && composer install 

Aber der Befehl composer install nach dem docker exec Befehl ausgeführt wird. Wie kann ich es tun?

+1

Haben Sie versucht: 'Docker exec [id]/bin/bash -c cd‘/var/www/project && composer install'' –

+0

danke, dude, ich habe deinen Kommentar nicht gesehen, aber es hat funktioniert! –

Antwort

12

In Ihrem ersten Beispiel geben Sie die -c Flagge an docker exec. Das ist eine einfache Antwort: docker exec hat kein -c Flag.

In Ihrem zweiten Beispiel analysiert Ihre Shell dies in zwei Befehle, bevor Docker es überhaupt sieht. Es entspricht dies:

if docker exec [id] cd /var/www/project 
then 
    composer install 
fi 

Zuerst wird die docker exec ausgeführt wird, und wenn es 0 (Erfolg) verlässt, composer install werden versuchen lokal, außerhalb von Docker zu laufen.

Sie müssen beide Befehle als einzelnes Argument an docker exec mit einer Zeichenfolge übergeben. Dann werden sie von einer Shell erst im Container interpretiert.

docker exec [id] "cd /var/www/project && composer install" 

Wie Sie jedoch in den Kommentaren angemerkt haben, funktioniert dies auch nicht. Das liegt daran, dass cd eine integrierte Shell ist und nicht für sich allein existiert. Der Versuch, den Befehl als ersten Befehl auszuführen, schlägt fehl. Der nächste Schritt besteht also darin, dies einer Shell zur Ausführung zu übergeben.

docker exec [id] "bash -c 'cd /var/www/project && composer install'" 

Und schließlich, an dieser Stelle die && hat sich zu einem inneren Satz von Anführungszeichen bewegt, so dass wir nicht wirklich brauchen die Anführungszeichen um den bash Befehl ... Sie können sie löschen, wenn Sie es vorziehen.

docker exec [id] bash -c 'cd /var/www/project && composer install' 
+0

Hallo, ich habe Ihren Befehl versucht und es funktioniert nicht, das ist der Fehler angezeigt: RPC-Fehler: code = 2 desc = Oci Laufzeitfehler: Exec fehlgeschlagen: container_linux.go: 247: Start-Container-Prozess verursacht "exec: \" cd/var/www/project && komposer install \ ": stat cd/var/www/project && composer install: keine solche Datei oder Verzeichnis" Offensichtlich existiert das Verzeichnis, so dass ich manuell darauf zugreifen kann. –

+0

@ Adrià Ja, ich hatte nicht gedacht, dass 'cd' hier der Befehl ist. Ich habe die Antwort aktualisiert, obwohl sie jetzt mehr oder weniger der Antwort entspricht, die Sie selbst gepostet haben (aber mit mehr Erklärungen, warum es funktioniert). –

0

als Nehal J Wani in seinem Kommentar sagte, die korrekte Syntax ist folgende:

docker exec [id] /bin/bash -c 'cd /var/www/project && composer install' 

vielen Dank!

1

Alles nach der Container-ID ist der auszuführende Befehl. Im ersten Beispiel ist -c keine Option für exec, aber ein Befehl docker versucht zu starten und schlägt fehl, da dieser Befehl nicht existiert.

Wahrscheinlich haben Sie diese Syntax von einem docker run Befehl gefunden, wo der Einstiegspunkt auf /bin/sh gesetzt wurde. Exec umgeht jedoch den Einstiegspunkt, daher müssen Sie den vollständigen Befehl zur Ausführung angeben. Wie andere haben darauf hingewiesen, enthält dieser Befehl eine Shell wie bash oder in das unten stehende Beispiel sh:

docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'