Докер новый пользователь на хосте, как сообщить докеру знать? - PullRequest
0 голосов
/ 09 июня 2019

Я создал нового пользователя на хост-машине (Ubuntu) с определенным uid и запустил контейнер с пользователем, который имеет тот же идентификатор пользователя.

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

Оказывается, пользователь хоста не входит в группы процесса докера (/ proc /...)?

Итак, нужно ли мне сообщать демону докера о новом пользователе? Перезагрузить демон докера? Перезагрузить systemctl? Что-то еще?

EDIT:

Итак, скажем, мой procId 12345, я делаю это:

cat /proc/12345/status

Я вижу это:

Name:   process-inside-container
State:  S (sleeping)
Tgid:   12345
Ngid:   0
Pid:    12345
PPid:   17847
TracerPid:  0
Uid:    20000   20000   20000   20000
Gid:    20000   20000   20000   20000
FDSize: 64
Groups: 145 
NStgid: 12345   30
...

Таким образом, внутри и снаружи контейнера я создал пользователя и группу с идентификатором 20000. Но, как видно из параметров "groups", процесс распознал только старую группу с идентификатором 145. Моя группа хостов с идентификатором 20000 не была включена. Таким образом, я полагаю, что разрешения не могут быть общими.

Или я ошибаюсь, что это значит?

EDIT2: Когда я говорю, что я смонтировал папку, это через docker run -v /data/:/data/.

Эта папка принадлежит на хосте пользователю и группе с идентификатором 20000, который является идентификатором, упомянутым ранее.

И по какой-то причине, несмотря на то, что пользователь и группа в контейнере имеют одинаковый идентификатор, у этого пользователя нет прав на редактирование папки.

EDIT3: я попытался ls папка или touch файл в ней, и я получил Permission Denied.

В конечном итоге сработало изменение владельца родительской папки.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Я не уверен, что полностью понимаю вашу проблему, но, надеюсь, это может прояснить ситуацию немного.

Если внутри контейнера у вас есть пользователь с таким же uid, как у другого пользователя на хосте,они оба имеют одинаковые права на подключенный том.На самом деле это означает, что существует только один uid, управляемый ядром, но с потенциально разными именами пользователей (одно для хоста и другое для контейнера)

Создайте пользователя с uid 10002 наhost:

 sudo groupadd -g 10002 host_group1
 sudo useradd -r -u 10002 -g host_group1 host_user1
 sudo mkdir /vol1
 sudo chown -R host_user1 /vol1

Создайте изображение и добавьте пользователя с именем container_user1 и тем же uid (10002).Dockerfile:

 FROM ubuntu:latest
 RUN groupadd -g 10002 container_group1
 RUN useradd -r -u 10002 -g container_group1 container_user1

 ENTRYPOINT ["/bin/sleep", "infinity"]

Создание образа:

docker build -t my-ubuntu .

Запустите образ с /vol1 подключенным томом:

 docker run -d -v /vol1:/vol1 --name my-ubuntu my-ubuntu

Проверьте права доступа к файлуhost_user1 и container_user1

В контейнере как пользователь container_user1

 su container-user1    
 echo aa >> /vol1/afile.txt

На хосте запишите в тот же файл, что и пользователь host_user1

 su host_user1
 echo bb >> /vol1/afile.txt

Если вы находитесь в такой ситуации, то все должно работать из коробки.Надеюсь, это поможет.

0 голосов
/ 09 июня 2019

Пользователь внутри контейнера Docker отделен от пользователя хоста.если вы хотите, чтобы у вашего пользователя в Docker-контейнере были идентификаторы uid и gid, аналогичные значениям на хосте, установите его, как показано ниже, во время выполнения.

docker run -d --user <uid>:<gid> ubuntu:latest sleep infinity

подробнее здесь

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