Как запустить Docker-контейнер как точный пользователь на хосте? - PullRequest
0 голосов
/ 23 ноября 2018

На моем хосте у меня есть пользователь 'appuser', и в моем dockerfile я создаю пользователя 'appuser'.

1) Допустим, моя программа берет один файл из / tmp / a / и выводит новый файл в / tmp / b /, который передается в качестве томов в контейнер с хоста.2) В качестве appuser на хосте я создаю /tmp/a/test.txt, но у выходного файла по какой-то причине есть права 'polkitd: libstoragemgmt' вместо 'appuser: appuser'.

Как я могу получитьубедиться, что у выходного файла будут права «appuser» (та же самая пользовательская программа, запущенная внутри контейнера)?

1 Ответ

0 голосов
/ 23 ноября 2018

Пользователь внутри контейнера не существует на хосте, то, что совместно используется двумя средами, - это UID / GID.Таким образом, внутри контейнера UID может отображаться на appuser, а на вашем хосте тот же UID может отображаться на polkitd.Если вы посмотрите на файл / etc / passwd на хосте и в контейнере, то увидите, что они, вероятно, не совпадают.Это действительно заметно только при использовании монтирования хоста, поскольку в этом сценарии на хосте видны владельцы файлов.

Одно из возможных решений, которое вы можете попробовать, - это монтировать / etc / passwd и / etc / group с хоста.к контейнеру, чтобы у вас были одни и те же пользователи и группы на каждой стороне, но это имеет недостаток в том, что образ может быть создан с пользователем, которого нет на хосте, или, если он существует, он может быть с другим UIDЗначения / GID, при которых файлы в файловой системе принадлежат не тем пользователям.

Мое личное решение - настроить UID / GID внутри контейнера так, чтобы он соответствовал пользователю на хосте, используя скрипт, который я запускаю внутри своей точки входа.,Он сравнивает владельца файла или каталога, который вы монтируете как том, с пользователем в контейнере, и, когда они не совпадают, пользователь контейнера изменяется.Для этого вам нужно запустить контейнер как root, но вы можете перейти от root к вашему appuser в конце точки входа, чтобы выполнить команду контейнера (обычно я использую exec + gosu для этого).Вы можете найти скрипт для этого, fix-perms, а также пример в моем репозитории с базовым изображением на https://github.com/sudo-bmitch/docker-base.

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