Docker コンテナを ENTRYPOINT や CMD の指定なしにちょっとだけ立ち上げたいことがある。例えば Docker イメージで提供されている OS の環境で少しだけ作業をしたい場合など。そんな時は大抵 -d でバックグラウンド指定して sleep コマンドで適当に長い秒数を指定してコンテナを起動した後に docker exec -it
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) するほうがもっと楽だった。(´・ω・`)