Dockerでコンテナに入らずコマンドだけ実行したい

Docker, Programming13 November 2020

先日Dockerを使っていて、ふと思いました。 コンテナ入ってコマンド打たなきゃだけど、わざわざ入るのめんどいなあ

基本的に起動中のDockerコンテナの中でコマンドを実行する場合、以下のような手順を踏む方が多いのではないでしょうか。

$ docker exec -it ${CONTAINER_NAME} ${SHELL_NAME}
> You want to exec cmd ...

「docker exec」に、「-it」オプションを付与してシェルを起動したのち、中でコマンド実行みたいな。

でもこれわざわざコマンド1つ2つ実行するだけなら、わざわざシェル起動してコンテナ入るのめんどい。

-itオプションについて

今までなんとなくシェルで対話的な動作をするとき(=ほぼ全ての時)は「-it」つけときゃいいんでしょ? みたいなノリでやってたので、ここがよくなかった。

以下、公式のドキュメントのオプション説明

-i

アタッチしていなくても STDIN をオープンにし続ける

-t

疑似ターミナル (pseudo-TTY) の割り当て

つまり、-iは標準入力を受けつけ続ける(=起動したシェルからの入力を受けつける?)で -tは入力を打つための擬似ターミナルを起動する。 であってるかな?

シェル使わないなら-itはいらない

オプションの解釈としては、シェルを起動しないのであれば-itはいらず、 さらにはdocker exec の最後の引数としていつも渡しているのは「/bin/bash」とか「sh」とか「bash」etc... なので、実態としてはシェル起動コマンドを実行しているだけと考えられる。

なので、ここのコマンドを以下のように好きなものに変えてやれば、シェルは起動せず任意のコマンドだけが実行される。 繰り返すけど、この時「-it」はいらない。

$ docker exec ${CONTAINER_NAME} ${YOUR WANT TO EXEC CMD}

すごく今更だけど知らなかった。