Docker, コマンド操作の初心者向けに書いています.
Docker コンテナを起動するとき, docker run -it ubuntu:18.04 bash
と入力したりする……,
-it
とはいったい何か, という話です.
-it は オプション -i と -t の指定
-it
と入力した場合,
-i or --interactive
と -t or --tty
2つのオプションを指定したという意味です.
(標準化されたものか分かりませんが一般的に)
-i
はショートオプション, --interactive
はロングオプション
と呼ばれます.
docker run -it ...
と docker run -i -t ...
この2つの指定は同じです.
docker run コマンドに限らず, 多くのコマンドでこういったオプション指定ができるようになってます.
(たとえばgrep. 大文字小文字を無視, ディレクトリ再帰, バイナリを無視を指定する場合の grep -irI
は grep -i -r -I
と同じ)
interactive (-i, --interactive) オプションは入力のこと
interactive オプションは, 「入力」のことです.
もうちょっと具体的には「標準入力」のことです. 次のものが相当します.
- キー入力
- パイプされたデータ
- ファイルからのリダイレクト
例を出します.
「seqコマンドの結果を, DockerのUbuntuイメージに入っているawkコマンドを使って偶数だけ出力するようフィルタしたい」
とします.
# seqコマンドの結果
$ seq 10
1
2
3
4
5
6
7
8
9
10
その場合は, パイプと docker run -i
コマンドを組み合わせれば実現できる, ということになります.
$ seq 10 | docker run -i ubuntu:18.04 awk '$1 % 2 == 0'
2
4
6
8
10
もうちょっと実用的な例をだします.
「作成したPythonスクリプトを, DockerのPythonイメージを使って実行したい」
ほとんどの場合は, volumeオプションでローカルPCのディレクトリを, Dockerコンテナに共有させて実行させますが,
場合によっては, リダイレクトが使えます.
# Pythonスクリプトの中身
$ cat hoge.py
print("hello")
# PythonスクリプトをDockerコンテナのPythonにリダイレクトして実行
$ docker run -i python:3.7 python < hoge.py
hello
tty (-t, --tty) オプションは疑似端末
ここ, ちょっとちゃんと理解できてないところもあるのですが, ttyは「端末」のことです.
ここでいう端末は, たとえばプロンプトが表示されたbash/zsh などのインタラクティブシェルのことです.
REPLを備えたPythonなどもそうです.
コマンドを入力できて, 実行できて, 即座に実行結果が表示されるアレです.
たとえば, Ubuntuのコンテナを起動すると同時に top コマンドを実行して監視してみたい
-t
オプション指定がないと, 「TERM環境変数が設定されていない」というエラーがでて
起動すらできません.
$ docker run --rm ubuntu:18.04 top
TERM environment variable not set.
docker run に -t
オプションを指定すると, topを起動できるようになります.
ちなみに, -t
だけの指定で -i
がないとキー入力が受け付けられなくなるため,
Qキー押下で終了できません.
(topコマンドはCtrl-C で割り込んで止められましたが,
起動するインタラクティブシェルによっては, それすらできないません.
別のターミナルでdockerコマンドを使ってコンテナを終了/停止する必要があります)
類似のオプションは他のソフトウェアにもあったりします.
たとえば, sshで接続した先でコマンドを実行する場合,
ssh $xxx_host program
のように実行コマンドを指定します.
この実行コマンドがインタラクティブシェル/REPLである場合は (インタラクティブシェルとして使いたい場合は), -t
を指定する必要があります.
ssh -t $xxx_host python
のように.
まとめ (というほどではないけど)
-
-i
オプションだけ指定することが有用なケースはそれなりにある -
-t
オプションだけ指定する状況はちょっと思いつかない
参考資料