Разрешения на файлы томов, созданные Docker - PullRequest
2 голосов
/ 06 июня 2019

Ну, я запускаю контейнер, который создаст / изменит некоторые файлы, которые мне нужно сохранить за пределами жизненного цикла контейнера.В результате я перемещаю папку в контейнер для этой цели:

docker run -v $(pwd)/data:/app/data my-image

При первом запуске $(pwd)/data не существует, поэтому Docker создаст его для меня.Тем не менее, он создает его, когда пользователь выполняет собственный демон-процесс, а это root.Это проблематично, поскольку пользователь в контейнере явно не root.

. Чтобы исправить эту проблему с разрешениями, я создал группу пользователей на хост-компьютере с тем же идентификатором, что и пользователь в контейнере, ипредоставили им доступ к родительской папке $(pwd)/data и добавили в нее настройки разрешений группы (chmod g+s).Поэтому, если я выполню следующую команду от имени пользователя root:

sudo mkdir whatver

папка whatever будет изменяться этой группой и расширением пользователем контейнера.однако, когда Docker создает папку $(pwd)/data, она все равно создается как принадлежащая группе root, и снова пользователь в контейнере не может изменять данные внутри него.

Прямо сейчас я обошел эту проблемусделав необходимые папки перед запуском контейнера.Однако это грязный обходной путь, и я ищу более чистое решение.Кто-нибудь еще сталкивался с этой проблемой?Проблема в том, что Docker не соблюдает настройки разрешений группы в родительской папке или я что-то здесь упускаю / что-то не так делаю?

1 Ответ

2 голосов
/ 06 июня 2019

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

Вы можете запустить свой контейнер с правами root и исправить разрешения для каталога с точкой входа, прежде чем запускать что-то вроде exec gosu app_user app_server в конце для удаления изroot для пользователя.Я делаю это в точке входа в моих docker-base изображениях, что полезно для рабочего процесса разработчика, где разработчикам часто нужно динамически обновлять контейнер для работы с их хост-средой.

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

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