자체 구축된 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