У меня проблема с монтированием файла в podman. Мои права доступа к файлу — 0600, и они недоступны для контейнера. Если я использую параметр --privileged или вариант распространения объема z, он работает. Но у меня вопрос, какой из этих вариантов я должен использовать? Или, может быть, есть другой способ сделать это...

Позвольте мне описать вам этот случай, чтобы избежать проблемы XY. Я хочу сгенерировать сертификат certbot с помощью DNS Cloudflare. Я использую Centos 8, поэтому мне приходится делать это с помощью docker/podman. Cerbot нужен ключ к Cloudflare, поэтому в пути ~/.secrets/clodflare я создаю файл cloudflare.ini и хочу смонтировать его в контейнер.

0
Paulo Tomé 26 Янв 2020 в 17:10

1 ответ

Позвольте мне попытаться поделиться некоторыми из моего собственного опыта, который я узнал в эти дни. Я не эксперт. Я не могу предложить, что вам делать, но могу попытаться объяснить, что происходит, когда вы запускаете podman с --privileged и :z. Вероятно, вы уже знали эти.

Я предполагаю, что вы используете podman без рута, то есть podman -v, а не sudo podman -v. Я также предполагаю, что ~/.secrets/clodflare принадлежит вам с UID 1000.

В вашем случае есть (по крайней мере) две проблемы с разрешениями, а именно традиционные разрешения Unix (0600 или -rw-------) и SELinux (container_file_t, user_home_t:, fusefs_t, и т.д.).

  • UNIX-разрешение

    • в контейнере файл/папка принадлежит root. Поэтому:
    • Если процесс в контейнере запускается root, то на узле он запускается вами. Таким образом, у него есть разрешение rw- на эту папку/файл. Я думаю, это ваш случай. Это не имеет ничего общего ни с --privileged, ни с :z.

    • Если процесс в контейнере запускается другим пользователем, скажем, с UID 1234, то на хосте он запускается пользователем с UID 101233 (по умолчанию на основе на настройке в /etc/subid). Поэтому у него есть только разрешение --- на этот файл. Если вы хотите изменить владельца на 1234 в контейнере (или 101233 на хосте), вы можете запустить, например, podman unshare chown -R 1234:1234 <path> или sudo chown -R 101234:101234 <path>. Однако я не думаю, что это относится к вам.

    • Если на хосте файл вам не принадлежит, то в контейнере он будет принадлежать кому-то другому в соответствии с настройкой в ​​/etc/subid.

    • вы можете найти дополнительную информацию по этой теме, погуглив podman namespace.

  • SELinux

    • на узле с поддержкой SELinux у вас по-прежнему возникает проблема разделения SELinux.
    • Используя --privileged, вы отключаете разделение SELinux (и многое другое). Но он не будет переименовывать файл/папку. Каждый раз, когда вы запускаете podman, вы должны запускать его как podman -v <host-path>:<container-path> --previleged <image>.
    • добавляя :z, вы разрешаете podman переименовать файл/папку. Вам нужно сделать это только один раз. Вы можете проверить разницу между до и после, указав файл/папку через ls -Z или ls -Zd. Как только файл или папка будут правильно переименованы, в следующий раз вы сможете просто запустить podman -v <host-path>:<container-path> <image> без :z и без --privileged.
    • чтобы узнать больше об этой проблеме, я не могу много сказать, так как она кажется мне слишком сложной для понимания. Полезны справочная страница podman run, пояснения по --privileged, -v, -security-opt.
1
Fang Hung-chien 2 Мар 2020 в 15:44