Назад | Перейти на главную страницу

Пространство имен пользователей Docker и sudo

Я пытаюсь заставить контейнер Docker работать с использованием функции пространства имен пользователей и sudo. Если я создам контейнер с -u флаг установлен на случайный UID, затем sudo не работает, и вы получаете это сообщение:

sudo: unknown uid 1234: who are you?

Пользователь явно не в /etc/passwd, что создает проблемы для sudo. Я пытаюсь заставить это изображение работать с настройками по умолчанию OpenShift, которые должны генерировать случайный UID, который является частью корневой группы (0), но мне нужно запускать команды как фиксированный пользователь позже, поэтому я хочу использовать sudo для этого (и строго контролировать, какие команды можно запускать). Кажется, это сработает, если я добавлю запись в /etc/passwd, но это кажется уродливым, поскольку его нужно будет запускать при каждом запуске контейнера (как /etc/passwd нет в томе).

У кого-нибудь есть другие предложения?

Изменить: обратите внимание, что OpenShift генерирует разные случайный UID каждый раз при запуске контейнера.

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

Например (я использую ubuntu: latest, поскольку вы не упомянули фактическое изображение, с которого пытаетесь запустить). Сначала запустите новый контейнер на основе выбранного образа и выполните всего одну команду, чтобы создать нового пользователя и добавить его в группу sudo:

$ docker run --name test ubuntu:latest useradd -u 1234 -G sudo newuser

Теперь создайте новое изображение на основе измененного изображения в новом контейнере:

$ docker commit test test-image
<image id>

Теперь у вас есть новый образ под названием «тестовое изображение», из которого вы можете запускать новые контейнеры. Запустите новый контейнер на основе этого образа, чтобы узнать, находится ли новый пользователь в / etc / passwd:

$ docker run --name test2 --rm test-image cat /etc/passwd | grep 1234
newuser:x:1234:1234::/home/newuser:

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

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

$ docker run --name test -it ubuntu:latest 

Обратите внимание, что простого добавления пользователя в группу sudo может быть недостаточно, чтобы он мог выполнять команды от имени пользователя root. Запустите visudo и внесите необходимые изменения. В приведенном выше примере изображения из ubuntu необходимо установить пакет sudo и редактор, прежде чем он разрешит sudo'ing.