In Ihrem ersten Beispiel geben Sie den -c
an Flag auf docker exec
. Das ist eine einfache Antwort:docker exec
hat keinen -c
Flagge.
In Ihrem zweiten Beispiel zerlegt Ihre Shell dies in zwei Befehle, bevor Docker es überhaupt sieht. Es ist äquivalent zu:
if docker exec [id] cd /var/www/project
then
composer install
fi
Zuerst die docker exec
ausgeführt wird, und wenn es 0 (Erfolg) beendet, composer install
wird versuchen, lokal ausgeführt zu werden , außerhalb von Docker.
Was Sie tun müssen, ist, beide Befehle als einzelnes Argument an docker exec
zu übergeben mit einer Zeichenfolge. Dann werden sie von einer Shell erst interpretiert, wenn sie sich bereits im Container befinden.
docker exec [id] "cd /var/www/project && composer install"
Wie Sie in den Kommentaren angemerkt haben, funktioniert dies jedoch auch nicht. Das liegt daran, dass cd
ist eine eingebaute Shell und existiert nicht alleine. Der Versuch, es als ursprünglichen Befehl auszuführen, schlägt fehl. Der nächste Schritt besteht also darin, dies zur Ausführung an eine Shell zu übergeben.
docker exec [id] "bash -c 'cd /var/www/project && composer install'"
Und schließlich an dieser Stelle die &&
wurde in einen inneren Satz von Anführungszeichen verschoben, sodass wir die Anführungszeichen um die bash
nicht wirklich brauchen Befehl ... Sie können sie löschen, wenn Sie möchten.
docker exec [id] bash -c 'cd /var/www/project && composer install'
Alles nach der Container-ID ist der auszuführende Befehl, also im ersten Beispiel -c
ist keine Option zum Ausführen, aber ein Befehls-Docker versucht auszuführen und schlägt fehl, da dieser Befehl nicht existiert.
Höchstwahrscheinlich haben Sie diese Syntax von einem docker run
gefunden Befehl, bei dem der Einstiegspunkt auf /bin/sh
gesetzt wurde . exec umgeht jedoch den Einstiegspunkt, sodass Sie den vollständigen Befehl zum Ausführen einfügen müssen. Wie andere bereits angemerkt haben, enthält dieser Befehl eine Shell wie bash oder im Beispiel unten sh:
docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'