デバッグのため、Dockerホストにログインし、docker ps
で実行中のコンテナーを調べて、対象となるコンテナーのIDを取得し、最後にdocker exec -it $cid bash
などでコンテナーの中に入り、デバッグなどをします。
例えば(例1):
$ docker ps | grep post
d448ca916642 postgres "/docker-entrypoint.s" About an hour ago Up About an hour 5432/tcp cocky_kare
$ docker exec d448 hostname
d448ca916642
こんな頻繁な操作であれば、もっと簡単にすべきだと思って、便利なツールを作りました。
ソースは GitHub にあげています。
使い方法:
$ dexec search-string [arg1, arg2, arg3]
search-string
は必須で、 arg1
などはコンテナーに実行するコマンド、もしコマンドを指定されていなければ、 bash
が渡されます。
dexec
を使えば、例1は下記のように一つのコマンドができます:
$ dexec post hostname
もし post
に該当するコンテナーが多数があれば、どのコンテナーまたはすべてのコンテナーを選択することもできます。
例えば、すべての busybox
コンテナーのIPを調べたいとしたら:
$ dexec busy ip addr show eth0
the is more than one containers found:
1 630f17f03600 busybox "tail -f /dev/null" About an hour ago Up About an hour goofy_kilby
2 699872b3712c busybox "tail -f /dev/null" About an hour ago Up About an hour clever_euler
please select one [1-2](ENTER for run in all containers):
Running commands in conatiner 630f17f03600
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.5/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:5/64 scope link
valid_lft forever preferred_lft forever
Running commands in conatiner 699872b3712c
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:4/64 scope link
valid_lft forever preferred_lft forever
上記のよう、 busybox
のコンテナーが2つありまして、どのコンテナーに実行するか聞かれます。上からコンテナーの順番を指定すると、そのコンテナーにコマンドが実行されます。 何も指定しなくて Enter
を押すと、すべてのコンテナーに実行されます。やめるには Ctrl+C
でOKです。
下記のビデオもご覧ください。