最初の例では、 -c
を指定しています docker exec
へのフラグ .それは簡単な答えです:docker exec
-c
がありません
2 番目の例では、Docker が認識する前に、シェルがこれを 2 つのコマンドに解析しています。これと同等です:
if docker exec [id] cd /var/www/project
then
composer install
fi
まず、docker exec
実行され、0 (成功) で終了した場合、composer install
ローカルで実行しようとします 、Docker の外部。
あなたがする必要があるのは、両方のコマンドを単一の引数として docker exec
に渡すことです 文字列を使用しています。その後、コンテナー内に入るまで、シェルによって解釈されません。
docker exec [id] "cd /var/www/project && composer install"
ただし、コメントで指摘したように、これも機能しません。それは cd
だからです シェルの組み込みであり、単独では存在しません。初期コマンドとして実行しようとすると失敗します。したがって、次のステップは、これをシェルに渡して実行することです。
docker exec [id] "bash -c 'cd /var/www/project && composer install'"
そして最後に、この時点で &&
は引用符の内部セットに移動したため、bash
を囲む引用符は必要ありません。 コマンド...必要に応じてドロップできます。
docker exec [id] bash -c 'cd /var/www/project && composer install'
コンテナー ID の後のすべてが実行するコマンドであるため、最初の例では -c
exec のオプションではありませんが、コマンド docker が実行を試み、そのコマンドが存在しないため失敗します。
docker run
からこの構文を見つけた可能性が高いです。 エントリポイントが /bin/sh
に設定されたコマンド .ただし、exec はエントリポイントをバイパスするため、実行するには完全なコマンドを含める必要があります。他の人が指摘しているように、そのコマンドには bash のようなシェル、または以下の例では sh:が含まれています:
docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'