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を使った快適な開発の参考になれば幸いです。