web-dev-qa-db-ja.com

bashプロンプトとスクリプトからdocker execに引数を渡す

Mongodb Dockerコンテナー内でコマンドを実行しようとしています。私のLinuxコマンドプロンプトからそれはかなり簡単で、私がこれを行うと機能します

docker exec -it d886e775dfad mongo --eval 'rs.isMaster()'

上記は、コンテナーに移動してコマンドを実行するように指示しています

"mongo --eval 'rs.isMaster()' - This tells mongo to take rs.isMaster() as an input and execute it. This works and gives me the output.

私はこれをbashスクリプトで自動化しようとしているので、私はこれをしました

cmd="mongo --eval 'rs.isMaster()"

そして、このように実行してみました

docker -H $node2 exec d886e775dfad "$cmd"

しかし、どういうわけか、Dockerはコンテナー内のバイナリファイルがmongoでもsthでもないと判断し、次のエラーが表示されると思います。

rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"mongo --eval 'rs.isMaster()'\": executable file not found in $PATH"
8
curiousengineer
docker exec -it d886e775dfad sh -c "mongo --eval 'rs.isMaster()'"

シェル(sh)を呼び出し、スクリプトを引用符で囲んで実行します。これは、ワイルドカード(*)のようなものも修正することに注意してください。そうしないと、Docker execでは正しく機能しません。

9
Stuart Holliday

あなたは実行する必要があります(あなたの例では欠けている一重引用符があります):

_cmd="mongo --eval 'rs.isMaster()'"
_

続いて(_$cmd_を囲む引用符なし):

_docker -H $node2 exec d886e775dfad $cmd
_

_$cmd_を引用符で囲むことにより、引数mongo、_--eval_、mongo --eval 'rs.isMaster()'を含む実行可能ファイルmongoではなく、実行可能ファイル'rs.isMaster()'を探していました。

1
BMitch

Mongoが_$cmd_の内容全体を実行するコマンドとして解釈しているように見えます。コマンドラインでパラメーターを引用しているので、これは理にかなっています。基本的に、あなたが_... exec "$cmd"_を実行したとき、シェルはドル記号を解釈し、インプレースのコンテンツに展開します。次に、二重引用符を解釈し、内部の内容全体(現在はmongo --eval 'rs.isMaster()'になっています)を1つのコマンドライン引数としてプロセスに渡します。これにより、mongoはmongo --eval 'rs.isMaster() in your path。明らかに存在しません。

0
Howard