web-dev-qa-db-ja.com

docker execで2つのコマンドを実行します

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コマンドが実行されます。どうすればいいですか?

15
BraveAdmin

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

コンテナIDの後はすべて実行するコマンドであるため、最初の例では-cはexecのオプションではありませんが、コマンドドッカーは実行しようとし、そのコマンドは存在しないため失敗します。

ほとんどの場合、エントリポイントがdocker runに設定されている/bin/shコマンドからこの構文を見つけました。ただし、execはエントリポイントをバイパスするため、実行するには完全なコマンドを含める必要があります。他の人が指摘しているように、そのコマンドにはbashのようなシェル、または以下の例ではshが含まれています。

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

nehal J Waniが解説で述べたように、正しい構文は次のとおりです。

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

どうもありがとう!

1
BraveAdmin

2つの任意のコマンドを実行する場合、他の答えは問題ありません。しかし、最初のコマンドが単にcdである場合、代わりに-wオプションを使用して作業ディレクトリを設定する必要があります。

docker exec -w {dir} {container} {commands}

あなたの例では:

docker exec -w /var/www/project {container} composer install
1
wisbucky