Проблема с пользователем и группой внутри контейнера

Предварительно

Сначала предварительный. При запуске док-контейнера с томом, сопоставленным с какой-либо частью хоста, пользователь внутри док-контейнера обычно является пользователем root, поэтому для файлов, созданных контейнером, хост не может редактировать, изменять или удалять их. Чтобы решить эту проблему, некоторые люди (включая того, кто создал образ, который я использую) рекомендуют использовать -u

Ситуация

У меня есть образ Docker (созданный другим человеком на другой машине)

Этот образ Docker предполагает, что пользователь будет пользователем с идентификатором 1000.

Проблема

Когда человек, который является единственным пользователем хост-компьютера (и чей идентификатор пользователя равен 1000), запускает образ, проблем не возникает. Однако в моем случае я второй пользователь этого хоста, поэтому мой идентификатор пользователя равен 1001. Итак, у меня есть следующее:

На хосте я делаю cat /etc/passwd и получаю несколько пользователей, в том числе:

firstuser:x:1000:1000:firstluser,,,:/home/firstuser:/bin/bash

myself:x:1001:1001:My Name,,,:/home/myself:/bin/bash

Затем :

СЛУЧАЙ 1 Я запускаю контейнер с

docker run -it --rm -u 1001:1001  -v /a/path:/another/path image  /bin/bash

потому что выполнение id -u и id -g дает мне 1001. (в конце концов, я второй пользователь)

Это приводит к тому, что

groups:cannot find name for group ID 1001

тогда мой пользователь становится "I have no name!" и когда я делаю cat/etc/passwd я получаю

originaluser:x:1000:1000::/home/originaluser:bin/bash ‹---- здесь нет ,,,

поэтому очевидно, что мой пользователь (1001) не существует, что вызывает много проблем.

Чтобы решить эту проблему, я попытался

CASE2 Я запускаю контейнер с

docker run -it --rm -u 1000:1000  -v /a/path:/another/path image  /bin/bash

что не вызывает предыдущую ошибку, и теперь, хотя я myself, но запускаю образ Docker как firstuser, в контейнере я originaluser (так как оба 1000)

Делая cat /etc/passwd я вижу

originaluser:x:1000:1000::/home/sensetime:bin/bash

и, как и предполагалось, мой пользователь originaluser.

Я должен быть счастлив, но это также вызывает проблемы!

Позже программа внутри контейнера пытается создать файл (с пользователем 1000), но поскольку он сопоставлен, а владельцем пользователя является 1001, это создание не удается.

Каков хороший способ предотвратить все эти проблемы и иметь возможность синхронизировать пользователя на хосте с пользователем в контейнере?


person KansaiRobot    schedule 12.10.2020    source источник
comment
Каков ваш вариант использования, когда пользователю на хосте необходимо напрямую редактировать файл данных, управляемый процессом-контейнером? Сообщение «У меня нет имени» в основном должно быть косметической проблемой в необычном случае запуска интерактивной оболочки в контейнере.   -  person David Maze    schedule 12.10.2020


Ответы (1)


Недавно я обнаружил fixuid, который может решить большинство ваших проблем.

uid/gid в контейнере не может (или не должен) совпадать с идентификатором на вашем хосте.

Бинарный файл fixuid setuid go, на который я ссылался выше, может решить эту проблему, изменив uid/gid пользователя в докере, чтобы он соответствовал настроенному вами.

Например:

Хост: uid/gid/name=1001/1001/kansai
Гостевой пользователь: uid/gid/name=1000/1000/user

Если вы добавили двоичный файл fixuid в свой контейнер (фаза сборки), вы можете запустить:

docker run --rm -it -u $(id -u):$(id -g) -v /a/path:/another/path image fixuid /bin/bash

Вы также можете установить fixuid в точке входа, чтобы ее было проще использовать.

person Cyrille Pontvieux    schedule 12.10.2020
comment
Спасибо за ответ!. На самом деле человек, создавший образ, включил fixuid в точку входа, но я получил fixuid: уже запускался в этой системе; не будет пытаться изменить ошибку UID/GID. Я написал вопрос об этом в stackoverflow.com/questions/64313676/ - person KansaiRobot; 12.10.2020