Docker でボリュームの所有者が root になってしまう問題のポイント

結論

とりあえずこの記事を見ればよいです。

qiita.com

以下は、上記の記事を実際にやってみて思ったことを書きます。

方法としては「うまくいく方法1 : ENTRYPOINTでuseraddでユーザーを作る」が良さそう

もちろんケース・バイ・ケースではありますが、上記記事の「うまくいく方法1 : ENTRYPOINTでuseraddでユーザーを作る」が自分にとってはしっくり来ました。

この方法の欠点らしきところは、

  • gosu という外部 CLI を用いる必要がある*1
  • 使い捨て Docker コマンドで実行する場合にはコマンドが冗長になる*2

です。

gosuapt でインストールすると時間がかかるので、直接 バイナリ を落としたほうが早いです。

最大の注意点

「ボリューム所有者が root になってしまう問題」に対処するにあたっての最大の注意点は、「ホスト側およびコンテナ側の両方のディレクトリともに同じ所有者であることが期待する挙動の上で必要がある」ことです*4

この点において具体的にハマるケースは「ローカル側のボリュームのディレクトリは予め当該ユーザで作成しておく必要があるのに、していない」ケースです。自分はこれにハマって 6時間 ぐらい溶かしました……。

具体的には例えば -v /tmp/hoge:/app/hoge という形でボリュームを作る場合、「ホスト側の /tmp/hoge は予めユーザによって作成されてなければいけない」ということです。存在しない場合には docker run 時に自動的に作成され、その所有者が root になってしまいます。

コンテナ側については自動作成時のカレントユーザが所有者になります。

参考までにの公式ドキュメント

matsuand.github.io

ヒント: はじめて利用する方は--mountを利用してください。 上級ユーザーは-vや--volumeを用いることに慣れているかもしれませんが、--mountを利用するように心がけてください。 --mountの方が簡単に利用することができるとの調査もあります。

docs.docker.jp

*1:単なる su コマンドだとエラーが出ました

*2:大半はコピペですが

*3:これは記事中に書かれているとおりです

*4:厳密には違うかも……

Powered by はてなブログ