dockerの一般的な利用の仕方ではあまり想定されないケースかもしれないが、
特定のユーザでログインした状態のコンテナを作りたいという場面に遭遇した。
やりたいこと
- 特定のユーザでログインした状態のシェルを提供すること
- その際、ユーザの.bash_profile(あるいあは.bashrc)を読み込んだ状態であること
- .bash_profileに記載したPATHやaliasを使いたい
- ユーザのログインシェルを利用したい(カスタマイズされたシェルとか)
docker runに-uオプションがあるので、これで実現できると思った。
[host] $ sudo docker run -u=user_name -i -t image_name /bin/bash
しかし…以下を確認してみると…
[docker] $ pwd
[docker] $ echo $PATH
[docker] $ alias
ディレクトリは "/" だし、PATHも通ってない。
どうやら.bash_profileなどは読んでいないようだ。普通にログインした状態とは違う。
dockerで-uでユーザを指定し場合、指定したuserでコマンドを実行するが、
サーバにユーザでログインしてからコマンドを実行するわけではないらしい。
ディレクトリはどうやら-wオプションで解決できるようだが…
[host] $ sudo docker run -u=user_name -w /home/user_name -i -t image_name /bin/bash
[docker] $ pwd
/home/user_name
ディレクトリはおっけーだが、
当然ながら依然として.bash_profileを読み込んでいるわけではない。
というわけで、docker起動時のコマンドをsuにしてしまうことで解決できることを思いついた。
[host] $ sudo docker run -i -t image_name su - username
suでスイッチユーザすれば、bash_profileもホームディレクトリも全部解決だ!!