背景
Docker コンテナに attach した際、コンソールで exit を実行するとコンテナが停止し、それまでの変更内容も保存されません。
慣れればよいのですが、大規模システムのテスト環境などでコンテナベースの環境運営を行う場合、外注先のエンジニアがたくさん出入りします。その際、Docker に不慣れなエンジニア(受託開発の場合はほぼ全員でしょう)が勢いで exit をタイプしてしまうことは容易に想像できます。
よって、コンテナの停止はホストからの docker stop のみに限定し、exit は無効とします。
前提
本投稿では Docker 1.9.0 を前提とします。使用する Docker image は ubuntu:latest(2015/11/16現在)です。
実現方式
alias を定義して、代わりに usage を表示します。
alias exit='echo Do not use command `exit` for logout operation. Use Ctrl-p,Ctrl-q.'
最初、Dockerfile に以下のように定義して、/etc/bashrc の最後に追記することを考えました。
CMD "echo alias exit='echo Do not use command `exit` for logout operation. Use Ctrl-p,Ctrl-q.'"
しかし、上記 Dockerfile を用いて docker build したところ、出来上がった Docker イメージには上記コマンド文が反映されていませんでした。
host# docker run -it test/ctn /bin/bash
ctn# tail -1 /etc/bashrc
原因はわかっていませんが、docker run を実行した際にイメージ内のファイルからプロビジョニングされ上書きされてしまっているのかもしれません。
暫定対応として、ホスト側に ToBe の bashrc ファイルをもっておき、COPY コマンドで置き換えるよう Dockerfile に記述しました。
COPY resource/bashrc /etc/bashrc
上記の Dockerfile を用いてコンテナ生成したところ、無事 exit の alias が有効になりました。
host# docker attach test_ctn
ctn# exit
echo Do not use command `exit` for logout operation. Use Ctrl-p,Ctrl-q.
改善点
以上で目的は果たしていますが、bashrc の構成管理を Docker イメージの外で行わねばならないのが少々億劫です。引き続き対処を検討していきます。