私が見つけた 2 つのオプション:
すべてを CHOWN (仕事をした後)
07
を実行しました 、コンテナは 15
以内にファイルを作成しました これは、docker プロセスによってどのように所有されているかです。ただし、28
はまだ私が所有しています。したがって、docker プロセス内で、私はそうします
30
46
56
を返します 私の場合、 64
です 私のユーザーの。ユーザー 71
がいないのに docker コンテナー内に、id があります (および 87
ユーザー名を尋ねると、単に「不明」と表示されます)。
とにかく、91
103
のコンテンツの所有権を素直に譲渡します 116
へ (それに関する限り、存在しませんが、コンテナの外にいるのは私です)。だから私は今、すべてのファイルを所有しています。コンテナーは、必要に応じて変更を加えることができます。その観点からは 122
であるためです。 .
そして、世界は順調です。
136
そのため、作成されたすべてのファイルには自動的に適切な所有者が割り当てられます
これを行う別の方法は 143
です Docker の実行時にフラグを立てます。
154
このように、コンテナ内の docker ユーザーは 169
です .
ただし: これは、コンテナー内のルート権限を放棄することを意味します (177
など)。その新しい uid でユーザーを作成し、それを 186
に追加しない限り グループ。
<ブロック引用>
あれは正しいですか?上記の実験に基づいて推測しているだけです.
おそらくこれは、両方ともカーネルで同じ数値を持っているためであり、ホーム ユーザーの ID が 1000 ではないシステムでテストした場合、すべての場合にアクセス許可が変更されるためでしょうか?
195
を読んでください 、これにより、ファイルのアクセス許可/所有権がどのように機能するかについてのより良いアイデアが得られるかもしれません.
ただし、基本的には、マシン上の各ファイルには、アクセス許可と所有権を定義する一連のビットが追加されています。あなたが 208
これらのビットを設定しているだけです。
あなたが 218
ユーザー名またはグループ名 222
を使用した特定のユーザー/グループへのファイル 236
を検索します ユーザー名と 241
の場合 グループが名前を ID にマップしようとします。ユーザー名/グループ名がそれらのファイルに存在しない場合、252
[email protected]:/test# touch test
[email protected]:/test# ll
total 8
drwxr-xr-x 2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r-- 1 root root 0 Oct 22 18:15 test
[email protected]:/test# chown test:test test
chown: invalid user: 'test:test'
ただし、262
は可能です。 マシン上にそれらの ID を持つユーザー/グループが存在するかどうかに関係なく、(もちろん、いくつかの正の整数の上限内で) 必要なものに ID を使用するファイル。
[email protected]:/test# chown 5000:5000 test
[email protected]:/test# ll
total 8
drwxr-xr-x 2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r-- 1 5000 5000 0 Oct 22 18:15 test
UID および GID ビットはファイル自体に設定されているため、これらのファイルを Docker コンテナー内にマウントすると、ファイルはホストと同じ所有者/グループ UID を持ちますが、274にマップされます。コード> これは、ルート (UID 0) が所有していない限り、おそらく別のユーザーになります。
もちろん、本当の問題は「これをどうするか」です。 bob が特定のホスト マシンに bob としてログインしている場合、bob としてコンテナーを実行でき、自分のホスト アカウントでファイルのアクセス許可が変更されることはありません。現状では、アカウントが変更されないようにするために、実際にはコンテナーをユーザー docker として実行する必要があります。
現在の設定では、UID> 284
のユーザー名を確認する必要があるようです ホスト上の UID> コンテナー内のユーザー名と一致 297
ホストにログインしているのと同じユーザーとして、マウントされたユーザー ディレクトリと対話したい場合。
301
で特定のユーザー ID を持つユーザーを作成できます .しかし、それは厄介な解決策のように思えます...
ホスト ユーザーのホーム ディレクトリをマウントしないソリューションを考え出す必要があるかもしれません。
そのため、root として実行されている Docker コンテナから出てきた (root が所有する) すべてのファイルの所有権を復元する方法を探しているこの投稿にたどり着きました。 、ホスト内の非特権ユーザーに。
コンテナー内のプロセスをルートとして実行する必要があったため、docker run で -u を使用できません。
自分のやったことを誇りに思っているわけではありませんが、bash スクリプトの最後に次のように追加しました:
docker run --rm -it \
--entrypoint /bin/sh \
-e HOST_UID=`id -u` \
-v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp \
alpine:latest \
-c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'
いくつかの行を分解してみましょう:
- コンテナ内で /bin/sh を実行します:
--entrypoint /bin/sh
- 現在のユーザーの uid を環境変数としてコンテナに渡します:
-e HOST_UID=`id -u`
- 再所有したいフォルダーをユーザーにマウントします (root が所有するファイルでいっぱいで、root として実行された以前のコンテナーによって出力されます )、この新しいコンテナの
312
の下 :
-v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp
323
を実行 ホスト ユーザーの uid を使用して再帰的にターゲット ディレクトリ (コンテナー内の335
にマウント) ):
-c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'
したがって、これにより、権限を root や sudo に「エスカレート」することなく、ファイルの所有権を現在のユーザーに戻すことができました。
汚れていますが、うまくいきました。お役に立てば幸いです。