Нужно создать файл в / dev пути в некорневом контейнере при запуске - PullRequest
2 голосов
/ 28 октября 2019

Я пытаюсь вызвать контейнер, в котором будет создан файл сокета в разделе / ​​dev (во время запуска, прежде чем любая точка входа сможет работать)

Теперь я понимаю, что каталог / dev в контейнере монтируется наtmpfs монтируется и создается динамически. Поэтому я не могу создать этот файл сокета как часть моей сборки. (Даже если я создам это в сборке, каталог будет удален в любом случае после сборки).

Контейнер, который я поднимаю (запускаю), имеет пользователя без полномочий root (testrun) и также не имеет-new-Опция привилегий передается при запуске, как показано ниже.

docker run \ --rm \ -it -d \ --name cont_testdev_1 \ --security-opt no-new-privileges \ --cap-drop all \ --user testrun:test \ testdev

Я пробовал или рассматривал следующие опции:

1) Создание этого файла сокета в моем сценарии точки входа. В моем случае это невозможно, так как / dev по умолчанию имеет разрешение на чтение только для пользователей без полномочий root, и мой контейнер запускается как пользователь 'testrun'. Также я не могу выполнить sudo, так как no-new-priveleges не предоставляется.

Любой способ создать / dev с разрешениями 777 в контейнерах?

2) Попробуйте вручную создать раздел / devс достаточными разрешениями при использовании параметра --tmpfs во время выполнения, как показано ниже.

--mount type=tmpfs,destination=/dev,tmpfs-mode=0777

Но это вызывает следующую ошибку в инициализации контейнера.

docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:424: container init caused \"rootfs_linux.go:114: reopening /dev/null inside container caused \\\"Failed to open /dev/null - open /dev/null: permission denied\\\"\"": unknown.

Не уверен, как преодолеть это.

3) Создайте этот файл сокета на хосте и смонтируйте его в контейнер во время выполнения. Но мне нужен этот файл сокета для монтирования tmpfs, потому что будет несколько экземпляров контейнера, и я не хочу создавать несколько файлов сокетов в файловой системе хоста.

4) Использование ACL и назначение доступа к testrun для /папка dev во время сборки образа. Но поскольку папка / dev удаляется после сборки, списки ACL также исчезают.

5) Модули ядра Linux и правила udev исключаются, поскольку в контейнерах нет ядра, а используется ядро ​​хоста. .

Очевидный вопрос, который задают многие, заключается в том, почему бы не создать файл сокета по какому-либо другому пути - это последний вариант, который мне остался, так как он будет означать много обработки изменений с моей стороны. Я просто хочу услышать мнения экспертов, прежде чем использовать эту опцию.

Так что мой вопрос к экспертам здесь, есть ли вариант, когда такие пользовательские файлы могут быть созданы с достаточными разрешениями (в основном в динамически создаваемых папках, таких как /dev) когда появится контейнер?

Буду очень благодарен за любую помощь или предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...