LoginSignup
10
11

More than 5 years have passed since last update.

Docker コンテナで exit を実行しても停止しないようにする

Last updated at Posted at 2015-11-16

背景

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 の最後に追記することを考えました。

Dockerfileの定義内容
CMD "echo alias exit='echo Do not use command `exit` for logout operation. Use Ctrl-p,Ctrl-q.'"

しかし、上記 Dockerfile を用いて docker build したところ、出来上がった Docker イメージには上記コマンド文が反映されていませんでした。

Dockerfileに定義した内容が反映されていない
host# docker run -it test/ctn /bin/bash
ctn# tail -1 /etc/bashrc

原因はわかっていませんが、docker run を実行した際にイメージ内のファイルからプロビジョニングされ上書きされてしまっているのかもしれません。

暫定対応として、ホスト側に ToBe の bashrc ファイルをもっておき、COPY コマンドで置き換えるよう Dockerfile に記述しました。

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 イメージの外で行わねばならないのが少々億劫です。引き続き対処を検討していきます。

10
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11