tail -f /dev/null で調査用コンテナを起動してそのままずっと保持しておく

f:id:kyagi:20180216163134p:plain

Docker コンテナを ENTRYPOINT や CMD の指定なしにちょっとだけ立ち上げたいことがある。例えば Docker イメージで提供されている OS の環境で少しだけ作業をしたい場合など。そんな時は大抵 -d でバックグラウンド指定して sleep コマンドで適当に長い秒数を指定してコンテナを起動した後に docker exec -it /bin/bash してその OS に入っているパッケージやそのバージョンを調査していた。

OS の調査用コンテナを起動して 1 時間後にコンテナを終了させる

$ docker run -d ubuntu sh -c 'sleep 3600' # 1 時間後にコンテナは終了する
5ec839f1cdc7ec657583a4fa992d556946d3b7775e9991175da68653020511ed

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
5ec839f1cdc7        ubuntu              "sh -c 'sleep 3600'"   7 seconds ago       Up 7 seconds                            eloquent_liskov

$ docker exec -it 5ec839f1cdc7 /bin/bash

root@5ec839f1cdc7:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

root@5ec839f1cdc7:/# exit
exit

これだと毎回コンテナを起動し直すはめになるので、調査に複数日かかったりコンテナ状態を保持しておきたい場合は無限ループを与えていた。

OS の調査用コンテナを起動してそのままずっと保持しておく(無限ループ編)

$ docker run -d ubuntu sh -c 'while :; do sleep 3600; done' # 数字はなんでもよい
69f6b10563b922e53139ed5acb5ceb9526daebc857f4a6cc031833f50e1ca04d

ただ、無限ループを与えるよりも tail -f /dev/null を使った方が簡単だいうことを知った。

OS の調査用コンテナを起動してそのままずっと保持しておく(tail -f /dev/null 編)

$ docker run -d ubuntu sh -c 'tail -f /dev/null'
1a258e96395f01d47ec976082ec2d99c5ee5b70949cef02a3108df2255240ab0


$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
1a258e96395f        ubuntu              "sh -c 'tail -f /d..."   3 minutes ago       Up 3 minutes                            unruffled_wilson
69f6b10563b9        ubuntu              "sh -c 'while :; d..."   4 minutes ago       Up 4 minutes                            gracious_wescoff
5ec839f1cdc7        ubuntu              "sh -c 'sleep 3600'"     5 minutes ago       Up 5 minutes                            eloquent_liskov

$ docker exec -it 1a258e96395f /bin/bash
root@1a258e96395f:/#


root@1a258e96395f:/# apt-get update
(... snip ...)

root@1a258e96395f:/# apt-get install dateutils
(... snip ...)

root@1a258e96395f:/# dateutils.ddiff 2018-04-01 2018-12-31 # 今年が終わるまで後何日?
274

確かにこれは楽だ。(´・ω・`)

追記:

docker run -itd ubuntu /bin/bash でバックグラウンドで起動してから、アタッチ(docker attach)とデタッチ(Ctrl+P, Ctrl+Q) するほうがもっと楽だった。(´・ω・`)