最小デモ例:設定と準備

最小デモ例:設定と準備

独自に構築されたDockerコンテナで特定のUIDとGIDでアプリケーションを実行したいか、または必要です。ホストに存在しないUID:GIDペアを使用しようとすると失敗します。


コメント

  • 予想されるUID:GIDがDockerホスト/名前空間に必ず存在する必要はありません。
  • カーネルとdockerdは、ユーザーの名前空間がアクティブな状態で実行されます。
  • UID:GIDは、26551:1000などの外部ハード要件によって決まります。
  • コンテナのターゲットUID:GIDは、ホストのUID:GIDに依存してはいけません。
  • 私の「デスクトップユーザー」である私のビルドユーザーのUID:GID = 1000:1000
  • ユーザーネームスペースの場合、subuidとsubgidは10000:14095の範囲にあります。

最小デモ例:設定と準備

Dockerfile:ユーザーが作成されました

そのため、コンテナのDockerfile(新しいビルドステップをより簡単にトリガできるようにARG + ENV)からユーザーを作成することから始めました。ここでは、${HOME} ディレクトリの作成を含む 26551:1000 です。

ARG USERID=26551
ENV runUID=${USERID}
ARG GROUPID=1000
ENV runGID=${GROUPID}
ARG USERNAME='testuser'
ENV runUSER=${USERNAME}
ARG groupNAME='testgroup'
ENV runGROUP=${groupNAME}

RUN groupadd -g ${runGID}  ${runGROUP} && \
    useradd -u ${runUID} -g ${runGID} -ms /bin/bash ${runUSER}  

ドッカービルド

ビルド中に機密情報を挿入する必要があるため、BuildKitを使用して実行します。

> DOCKER_BUILDKIT=1  docker build  --secret id=foo_file,src=secret/foo.file --progress=plain  . -t testfoo:latest

コンテナコンテキスト

インタラクティブコンテナで画像内を移動すると、$ {HOME}ディレクトリは私の「ホストユーザー」のsubuid:subgidの範囲内のUID:GIDに属します。

[root@e436d2050f67 /]# grep testuser /etc/passwd
testuser:x:26551:26551::/home/testuser:/bin/bash

[root@e436d2050f67 /]# ls -all /home
total 0
drwxr-xr-x. 1 root  root   16 Aug 16 13:40 .
drwxr-xr-x. 1 root  root  248 Aug 16 13:51 ..
drwx------. 1 12455 12455  64 Aug 16 13:40 testuser

実際には$ {HOME}が必要ないので、これはおそらく公平です(ただし、これが異なるsubuid / subgidスコープを持つ他のホストでどのように機能するのか疑問に思います)。


質問

ユーザー切り替えが機能しません

問題は、ユーザーがコンテナのpasswdなどに存在しますが、chrootやsu(do)を介して切り替えることができないことです。

[root@e436d2050f67 /]# chroot --userspec=1000:26551 / id
chroot: failed to set group-ID: Invalid argument

しかし、私の「ホストユーザー」に切り替えるとうまくいきます。

[root@e436d2050f67 /]# chroot --userspec=1000:1000 / id
uid=1000 gid=1000 groups=1000

コンテナでユーザーを定義するのではなく、dockerdだけがUID:GIDをマップします。

私はすでに試しました。固いあるいは、動作は同じです。つまり、ユーザーはコンテナ/ホストに「存在」しません。

[root@e436d2050f67 /]# gosu 26551:26551 id
error: failed switching to "26551:26551": invalid argument
[root@e436d2050f67 /]# gosu 1000:1000 id
uid=1000 gid=1000 groups=1000

Docker - ユーザー

ホストに UID がないため、指定したユーザーでコンテナーを実行できません。

> docker run --user=26551 -it testfoo:latest /bin/bash
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "setup user: cannot set uid to unmapped user in user namespace": unknown.

質問

コンテナUID:GIDをホストで利用可能な一部のsubuid:subgidにマッピングすることで、ホストに存在しないUIDの下のコンテナでプロセスをどのように実行できますか?


付録1

  • SELinuxが無効になっています。
  • この問題は、コンテナで利用可能な実際のユーザー:グループに関連しているようです。

su または gosu を使用してコンテナービルドで定義/作成されたユーザー/グループのいずれかに切り替えることはできませんが、コンテナー内のホストユーザーの UID:GID に切り替えることはできます。

[root@5e5137b95434 /]# gosu nobody id
uid=99(nobody) gid=99(nobody) groups=99(nobody)

[root@5e5137b95434 /]# su --group=99 testuser id
su: group 99 does not exist
[root@5e5137b95434 /]# su nobody id
This account is currently not available.

[root@5e5137b95434 /]# su --group=120000 testuser id
su: group 120000 does not exist

[root@5e5137b95434 /]# gosu 26551:26551 id
error: failed switching to "26551:26551": invalid argument

[root@5e5137b95434 /]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
input:x:999:
systemd-journal:x:190:
systemd-network:x:192:
dbus:x:81:
testgroup:x:26551:

コンテナに明示的に定義されていないホストユーザーに切り替えます。

[root@5e5137b95434 /]# gosu 1000:1000 id
uid=1000 gid=1000 groups=1000
[root@5e5137b95434 /]# gosu 1000:1000 whomai
error: exec: "whomai": executable file not found in $PATH
[root@5e5137b95434 /]# gosu 1000:1000 echo "testfooout" > /home/testuser/1000_1000

> host > ls -all /tmp/foo/1000_1000 
-rw-r--r-- 1 120000 120000 11 Aug 21 10:02 /tmp/foo/1000_1000
> host > id
uid=1000(hartlocal) gid=1000(hartlocal) groups=1000(hartlocal),10(wheel),969(docker)

[root@5e5137b95434 /]# gosu 1000:1000 sleep 600

> host > cat /proc/5737/cmdline 
sleep600
> host > ls -all /proc/5737/cmdline 
-r--r--r-- 1 121000 121000 0 Aug 21 10:04 /proc/5737/cmdline

ベストアンサー1

私の質問に答える

ユーザーの名前空間に定義されている subuid/subgids が不十分です。

今後

/etc/subuid
/etc/subgid
  dockeruser:120000:10000

UID = 26551のコンテナにユーザーを作成しました。ここで、26551は[120000、120000 + 10000]の範囲内にないため、このユーザーに切り替えることはできません。

固定する

subuid および subgid の範囲を [200000,200000+100000] に拡張し、実際に UID を含めます。

/etc/subuid
/etc/subgid
  dockeruser:200000:100000

おすすめ記事