Понимание создания пользователя / uid в Docker - PullRequest
2 голосов
/ 09 апреля 2019

Даже после просмотра большого количества материалов и ответов на вопросы, я все еще не понимаю, как используется ucker / пользователь Docker.

Я понимаю следующие пункты:

  1. Экземпляр изображения называется контейнером.
  2. uid / gid поддерживается базовым ядром, а не Container.
  3. Ядро понимает номер uid / gid, а не имя пользователя / имя группы, а имя является псевдонимом и предназначено только для чтения человеком.
  4. Все контейнеры являются процессами, поддерживаемыми демоном docker и будут видны как процессы на хост-компьютере (ps -ef)
  5. root (id = 0) является пользователем по умолчанию в контейнере, и это можно изменить либо с помощью инструкции USER в Dockerfile, либо путем передачи флага -u в Docker Run

С учетом всего вышесказанного, когда в моем Dockerfile есть указанная ниже команда, я предполагаю, что новый пользователь (my-user) будет создан с увеличенным uid.

RUN addgroup my-group && adduser -D my-user -G my-group
  • Что произойдет, если я запускаю одно и то же изображение несколько раз, т.е. несколько контейнеров? Будет ли один и тот же uid назначен всем процессам?

  • Что произойдет, если я добавлю ту же команду выше в другое изображение и запусту это изображение как контейнер? - я получу новый uid или такой же uid, как предыдущий?

  • Как приращение uid происходит в контейнере по отношению к хост-машине.

Любые указатели были бы полезны.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Отсутствует переназначение пространства имен пользователя , важны только две вещи:

  1. Что такое числовой идентификатор пользователя; и
  2. Что находится в файле /etc/passwd.

Помните, что каждый контейнер и хост имеют отдельные файловые системы, поэтому каждая из этих вещей может иметь отдельные /etc/passwd файлы.

Что произойдет, если я запускаю одно и то же изображение несколько раз, т.е. несколько контейнеров? Будет ли один и тот же идентификатор назначен всем процессам?

Да, поскольку каждый контейнер получает копию одного и того же файла /etc/passwd из образа.

Что произойдет, если я добавлю ту же команду выше в другое изображение и запусту это изображение как контейнер? - Я получу новый UID или такой же UID, как предыдущий?

Это зависит от того, что на самом деле делает adduser; оно может быть одинаковым или разным.

Как происходит увеличение uid в контейнере по отношению к хост-машине.

Они полностью и полностью независимы.

Также помните, что вы можете docker push / docker pull встроенный образ для запуска его на другом хосте. Это принесет с собой файл /etc/passwd образа, но среда хоста может быть совершенно другой. Соответственно, не рекомендуется пытаться сопоставить uid-сопоставление определенного хоста в Dockerfile, потому что будет неправильно, если вы попытаетесь запустить тот же образ где-нибудь еще.

1 голос
/ 09 апреля 2019

Когда вы пытаетесь добавить пользователей в операторе RUN, не создает пользователя на хосте. Если вы не укажете пользователя с оператором USER в своем Dockerfile или флагом -u при запуске контейнера (при условии, что родительские Dockerfiles также не содержат оператора USER), процесс контейнера на хосте будет просто запускаться как root user, если вы запустили демон docker от имени root.

Поэтому, если вы создаете пользователя с помощью RUN addgroup my-group && adduser -D my-user -G my-group, он просто создает пользователя в контейнере, то есть пользователь является локальным для контейнера. Таким образом, каждый экземпляр (контейнер) этого образа, который вы запускаете, будет иметь один и тот же uid пользователя внутри контейнера. Примечание: этот пользователь не будет существовать на хосте.

Если вы хотите запустить контейнерный процесс на хосте от имени другого пользователя (который существует на хосте), тогда у вас есть 3 варианта:

  • Добавить оператор USER в Dockerfile
  • Используйте флаг -u во время работы контейнера
  • Вы можете использовать функцию пространства имен пользователя докера

Я настоятельно рекомендую понять пространство имен пользователя и сопоставления, прочитав эту документацию: Изолировать контейнеры с пространством имен пользователя

...