dockerでbind mountしたファイルのowner問題

docker logo

dockerを開発環境に用いた場合、ソースコードのowner/permission問題は結構面倒な問題です。

dockerのコンテナ内で変更を伴うファイルを永続的に管理したい場合、2つの方法があります。

ボリュームマウント

一つは、ボリュームマウント。こちらは比較的新しい方法になります。
HOSTでソースコードなどを変更する必要がないのであれば、ファイル類をすべてコンテナ内管理する。具体的にはボリュームマウントしたフォルダでファイルを管理するのがベストです。
問題は、ボリュームマウントしたファイルはHOSTから直接操作できないのが難点です。
ですので、ソースコードを変更しなければならない開発環境で使うのは難しいです。
また、HOSTで自由に読み書きできないので、バックアップをとるのもちょっと面倒。
docker snapshotみたいな機能があればいいんですが…現状はないっぽいです。

因みに、VSCodeであれば、拡張機能を使うことによってボリューム内のファイルの読み書きが可能です。

これから新規に開発環境を作るのであれば、VSCodeを使うことを前提にボリュームマウントを使うことをお勧めします。

バインドマウント

一つは、昔からあるバインドマウントです。
これは、ホストのフォルダを指定してそのフォルダをコンテナ内にマウントする方法です。
しかし、この方法には重大な欠陥があります。
ホストとコンテナ内のユーザーは別物です。
ホストで作ったファイル、コンテナ内で作ったファイルが相互に読み書きできなくなってしまいます。

特に問題なのはWindowsでDockerを使う場合。
Dockerのコンテナは基本的にLinux/Unixベースで動作していますが、Windowsのファイルシステム、ユーザー管理とは全く違います。
ですので、Windowsのフォルダにbind mountしたフォルダに対してコンテナ内でパーミッションを設定しても動作しません。

ですのでWindowsでDockerを使うのはお勧めできません。まじでクソです。本当にクソです。大事なことなので2回言いました。(ちなみにvolume mountであれば大丈夫です)
トラブりたくないのであればMacを使ってください…と、言いたいところですが、現状ではM1チップでのDockerの動作にも問題があるため、現状は悩ましい状態です。
ですので、後ほどWindowsでDockerを使う際の注意点も記載します。

回避策その1

コンテナ内にHOSTと同じユーザーを作り、そのユーザーで動作するように書き換える。
そのユーザーをROOTグループに追加して、新規作成したファイルはグループ内で読み書き可能なように設定する。

これで、行けるはずです。理論上は。
ですが、設定はおそらく非常に面倒ですし、一人だけで使うならまだしも、普通は複数人で使うことが前提だと思うので、この方法はあまりお勧めできません。

回避策その2

全部rootで操作する。それだけです。

ホストでrootになって、すべての作業をrootで行えば、みんなrootなのでパーミッションの問題は関係なくなります。
大体のコンテナは、rootで動作させることが前提の作りになっている場合が多いので何か特別な設定をする必要はないと思います。

基本的に、作業はrootでするなっていうのが常識だとは思いますが、dockerを利用する場合は仕方がないのかもしれません。

回避策その2 Windowsの場合

Windowsの場合、そもそもファイルシステムの問題があるためこの方法が使えません。
ですが、一つ方法があります。
その方法はWSL経由でdockerを使う方法です。

ただし、注意点があります

バインドマウントするフォルダはHOSTの領域ではなくLinuxの領域にしましょう。
WSLでログインすると”/mnt/c/” 等で始まるHOSTのホームディレクトリがカレントになりますが、こちらを使うのではなく”/home”などのLinuxベースのファイルシステムの下で作りましょう。

もう一つはWSL2を使ったほうがよさそうということです。
良くは調べていないのですがWSL1だと、Windowsのファイルシステムの中でLinuxのシステムが動くようなので、前述のオーナーやパーミッションの問題が起きるようです。
WSL2はファイルシステム自体がHOSTのファイルシステムとは独立したバーチャルドライブの中で動いているのでこの問題が発生しません。

ただ、HOSTからWSL2のLinuxフォルダが見れない問題があります。

ですが、WSL2からエディタを開けば問題ないようです。もちろん、viとかLinux付属のものでなくて、Windows上にインストールしたvscodeが起動できます。ソースコードがあるフォルダで

code .

とすれば開きます。

ですが、これだけだとまだ問題があります。
普通に起動するとrootではなくユーザーでログインしてしまいます。
suでrootになったり、sudo コマンドで起動しても、ファイルの読み書きやvscode内のターミナルはユーザーモードでログインしてしまいます。

これだと、オーナーの問題が発生して自由な読み書きができません。

この問題の解決には、デフォルトのログインユーザーを変更する必要があります。

方法は、WindowsPoserShell

 ubuntu2004 config --default-user root

これで、次回起動時に自動的にrootでログインした状態で起動します。
VSCodeもその中で動くターミナルもrootユーザーになります。

最後に

常識として、rootで作業してはいけませんというのはわかりますが、
そもそもコンテナを自由に編集する権限がない場合、
手っ取り早く問題を解決したい場合
は、これしか方法がないんです。
なんだかなぁとは思いますが、ローカルの閉鎖された開発環境であれば、セキュリティー上の特に問題はないと思います。

タイトルとURLをコピーしました