最初の例では、 -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'