Docker execで2つのコマンドを実行しようとしています。具体的には、特定のディレクトリ内でコマンドを実行する必要があります。私はこれを試しましたが、うまくいきませんでした:
docker exec [id] -c 'cd /var/www/project && composer install'
パラメーター-c
は検出されません。私もこれを試しました:
docker exec [id] cd /var/www/project && composer install
ただし、composer install
コマンドの後にdocker exec
コマンドが実行されます。どうすればいいですか?
最初の例では、-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 run
に設定されている/bin/sh
コマンドからこの構文を見つけました。ただし、execはエントリポイントをバイパスするため、実行するには完全なコマンドを含める必要があります。他の人が指摘しているように、そのコマンドにはbashのようなシェル、または以下の例ではshが含まれています。
docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'
nehal J Waniが解説で述べたように、正しい構文は次のとおりです。
docker exec [id] /bin/bash -c 'cd /var/www/project && composer install'
どうもありがとう!
2つの任意のコマンドを実行する場合、他の答えは問題ありません。しかし、最初のコマンドが単にcd
である場合、代わりに-w
オプションを使用して作業ディレクトリを設定する必要があります。
docker exec -w {dir} {container} {commands}
あなたの例では:
docker exec -w /var/www/project {container} composer install