Dockerでは、コンテナー内で作成されたファイルは、ホストからそれらを検査している間、予測できない所有権を持つ傾向があります。ボリューム上のファイルの所有者はデフォルトでroot(uid 0)ですが、root以外のユーザーアカウントがコンテナーに関与してファイルシステムに書き込むとすぐに、所有者はホストの観点から多かれ少なかれランダムになります。
dockerコマンドを呼び出しているのと同じユーザーアカウントを使用して、ホストからボリュームデータにアクセスする必要がある場合に問題になります。
一般的な回避策は次のとおりです。
- Dockerfiles(非移植可能)での作成時にユーザーにuIDを強制する
- ホストユーザーのUIDを
docker run
環境変数としてコマンドに渡し、chown
エントリポイントスクリプトのボリュームでいくつかのコマンドを実行します。
これらのソリューションはどちらも、コンテナー外の実際のアクセス許可をある程度制御できます。
私は、ユーザーの名前空間がこの問題の最終的な解決策になると期待していました。最近リリースされたバージョン1.10と--userns-remapをデスクトップアカウントに設定して、いくつかのテストを実行しました。ただし、マウントされたボリュームのファイル所有権を処理しやすくすることができるかどうかはわかりません。実際には逆になる可能性があります。
この基本的なコンテナを開始するとします
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
そして、ホストからのコンテンツを検査します:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
この番号「100000」はホストユーザーのサブUIDですが、ユーザーのUIDに対応していないため、権限がないとtest.txtを編集できません。このサブユーザーは、docker以外の実際の通常のユーザーとは親和性がないようです。マッピングされていません。
この投稿で前述した、ホストとコンテナ間でUIDを調整することで構成されていた回避策UID->sub-UID
は、名前空間で発生するマッピングのために機能しなくなりました。
次に、(セキュリティを向上させるために)ユーザー名前空間を有効にしてdockerを実行する一方で、dockerを実行しているホストユーザーがボリュームで生成されたファイルを所有できるようにする方法はありますか?