Dockerで作成したファイルがrootで作成される問題の解決方法
概要
開発環境などでDockerを使う場合、プロジェクトなどのファイルをVolumeとしてマウントして使うということがあると思います。
私も、RailsでWebアプリケーションを開発する際などにDockerを使っているのですが、ただ使うだけではrootでファイルが作られるため、Permissionエラーが発生するなど面倒なことが起きます。
ここでは、私が実践しているDockerでファイルを作成しても、rootでファイルが作られない方法を紹介します。
環境
- Ubuntu 18.04
- Docker 18.09
原因
私が調べた限り、そもそもこのようにrootでファイルが作成される原因として、Dockerの内部ではユーザid(uid)やグループid(gid)が何も指定しない限り0でログインし、処理をしています。
そのため、Dockerで何かファイルを作るとuidやgidが0、つまりrootでファイルを作ったのと一緒になり、そのままホストマシンでもこの設定が受け継がれます。
つまり、uidとgidをどうにかすれば良いということです。
解決方法
解決方法としてはいくつかあります。
例えば、Dockerではdocker run
を実行するときに、-uオプションでuidとgidを指定して実行するということができます。
しかし、この方法ではDocker Composeを使っている際には行うことができません。
そこで、このような環境でもできる、私が行っている解決方法を紹介します。
まず最初に、ホストマシンでログインしているユーザのuidとgidを調べます。
調べるにはidコマンドなどを使います。
uidとgidを知ることができたら、Dockerのコンテナにログインします。
コンテナでは、次のようにuseraddコマンドを使ってホストマシンと同じuidとgidでユーザを作成します。
useradd -u ホストマシンのuid -g ホストマシンのgid ユーザ名
ユーザ名はホストマシンのものと異なっていても構いません。
重要なことは、uidとgidがホストマシンと同じであるということです。
最後に、suコマンドでユーザを切り替えます。
su ユーザ名
これで、ファイルの作成などをしてもrootで作成されることはなくなり、すでにあるファイルなどと同じユーザのものとして作成されるようになりました。
注意点として、すでにrootで作られているファイルについては、chownコマンドなどでファイルのオーナーを変えておく必要があります。
さいごに
Docker for Macでは、このようなことはないようなので、少し羨ましく感じています。
Dockerを使った快適な開発の参考になれば幸いです。