С помощью параметра командной строки --uidmap
Вы можете указать, как мой пользователь UID и мой пользователь sub UID сопоставляются с контейнером.
(См. справочная страница за подман беги
).
Параметр командной строки --gidmap
работает так же, но для GID вместо UID.
Давайте посмотрим UID и GID для пользователя нгинкс в образе контейнера docker.io/библиотека/nginx
$ podman run --rm docker.io/library/nginx grep nginx /etc/passwd
nginx:x:101:101:пользователь nginx,,,:/несуществующий:/bin/false
$
Результат:
Числа позже используются при установке двух переменных оболочки.
$ контейнер_uid = 101
$ контейнер_гид = 101
(Переменные оболочки container_uid и container_gid не имеют никакого значения вне этого поста.
Они просто введены, чтобы облегчить чтение ответа)
Загляните в файлы /etc/subuid и /etc/subgid на хосте.
Пользователь мой пользователь имеет эти дополнительные UID и дополнительные GID.
$ grep myuser /etc/subuid
мой пользователь: 231072: 65536
$ grep myuser /etc/subgid
мой пользователь: 231072: 65536
$
Результат:
мой пользователь имеет 65536 дополнительных UID и 65536 дополнительных GID.
Числа позже используются при установке двух переменных оболочки.
$ subuid_size = 65536
$ subgid_size = 65536
(Переменные оболочки subuid_size и subgid_size не имеют никакого значения вне этого поста.
Они просто введены, чтобы облегчить чтение ответа)
Вместо того, чтобы смотреть вверх subuid_size и subgid_size в /etc/subuid и /etc/субгид, более общий метод — запустить команды
subuid_size=$(( $(podman info --format "{{ range .Host.IDMappings.UIDMap }}+{{.Size }}{{end }}" ) - 1 ))
subgid_size=$(( $(podman info --format "{{ range .Host.IDMappings.GIDMap }}+{{.Size }}{{end }}" ) - 1 ))
Преимущество в том, что это также работает, когда файл /etc/nsswitch.conf используется вместо /etc/subuid и /etc/субгид. (Видеть человек
)
Демо 1: сопоставить пользователя мой пользователь на хосте пользователю корень внутри контейнера
Нет необходимости указывать --uidmap
ни --gidmap
потому что это стандартное отображение.
Создайте доступный для записи каталог для всего мира демо1
$ мкдир демо1
$ chmod 777 демо1
$
Создайте новый файл, работающий как корень внутри контейнера:
$ подман запустить --rm \
-v ./demo1:/dir:Z \
docker.io/library/nginx touch /dir/created_by_root
$
Создайте новый файл, работающий как нгинкс внутри контейнера:
$ подман запустить --rm \
--пользователь 101:101 \
-v ./demo1:/dir:Z \
docker.io/library/nginx touch /dir/created_by_nginx
$
Список файлов на хосте
$ ls -l демо1
всего 0
-rw-r--r--. 1 231172 231172 0 27 авг 20:24 created_by_nginx
-rw-r--r--. 1 мой пользователь мой пользователь 0 27 авг 20:22 created_by_root
$
Результат: файл created_by_root принадлежит мой пользователь:мой пользователь
Демо 2: сопоставить пользователя мой пользователь на хосте пользователю нгинкс внутри контейнера
Создайте доступный для записи каталог для всего мира демо2
$ мкдир демо2
$ chmod 777 демо2
$
Создайте новый файл, работающий как корень внутри контейнера:
$ subuid_size = 65536
$ subgid_size = 65536
$ контейнер_uid = 101
$ контейнер_гид = 101
$ подман запустить --rm \
--uidmap=0:1:$container_uid \
--uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid)) \
--uidmap=$container_uid:0:1 \
--gidmap=0:1:$container_gid \
--gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid)) \
--gidmap=$container_gid:0:1 \
-v ./demo2:/dir:Z \
docker.io/library/nginx touch /dir/created_by_root
$
Создайте новый файл, работающий как нгинкс внутри контейнера.
$ subuid_size = 65536
$ subgid_size = 65536
$ контейнер_uid = 101
$ контейнер_гид = 101
$ подман запустить --rm \
--пользователь $container_uid:$container_gid \
--uidmap=0:1:$container_uid \
--uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid)) \
--uidmap=$container_uid:0:1 \
--gidmap=0:1:$container_gid \
--gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid)) \
--gidmap=$container_gid:0:1 \
-v ./demo2:/dir:Z \
docker.io/library/nginx touch /dir/created_by_nginx
$
Список файлов на хосте
$ ls -l демо2
всего 0
-rw-r--r--. 1 мой пользователь мой пользователь 0 27 авг 20:26 created_by_nginx
-rw-r--r--. 1 231072 231072 0 27 авг 20:25 created_by_root
$
Результат: файл created_by_nginx принадлежит мой пользователь:мой пользователь
Заключение
Использовать --uidmap
и --gidmap
так же, как и в Демо 2.
Совет по устранению неполадок
Я написал совет по устранению неполадок:
Невозможно получить доступ к переданным устройствам или файлам в контейнере без корневого каталога (проблема сопоставления UID/GID) который содержит метод, описанный в Демо 2