Определение
podman
позволяет входить в другой USER
и MNT
namespace без запуска контейнера, чтобы посмотреть что происходит не выходя за рамки обычного процесса (к слову, это лишь удобная надстройка над обычной командой unshare
)
Подготовка
Проверяем поведение в другом USER
namespace:
# Смотрим UID mapping
podman unshare cat /proc/self/uid_map
# Выведет nobody
podman unshare ls -ld /
# Проверяем USER/MNT namespace на хосте и в изолированном namespace
ls -l /proc/self/ns/user /proc/self/ns/mnt
podman unshare ls -l /proc/self/ns/user /proc/self/ns/mnt
Проверяем поведение в другом MNT
namespace:
echo hello > /tmp/testfile
mount --bind /tmp/testfile /etc/shadow
mount: /etc/shadow: must be superuser to use mount.
podman unshare bash -c "mount -o bind /tmp/testfile /etc/shadow; cat /etc/shadow"
hello
Практика
Теперь перейдем к просмотру содержимого образа при помощи podman mount
В общем виде команда для просмотра выглядит так: podman mount <URL/Image>
(можно использовать имя образа или путь к нему для предварительного podman pull
)
Но podman mount
требует либо повышения привилегий, либо запуск в изолированном USER
namespace и тут на помощь приходит команда podman unshare
, которая создает выделенный USER
и MNT
namespace
Помимо этого потребуется команда podman image mount
, которая монтирует ФС из образа в ФС хоста и выводит полный путь к ней на хосте
Let’s try:
# Заходим в другой namespace
podman unshare
# Записываем путь в переменную
mnt=$(podman image mount <URL/image>)
# Теперь можно исследовать ФС образа
ls $mnt/var/
cat $mnt/etc/shadow
# Для завершения работы с образом
podman image unmount <URL/image>
exit