Убедитесь, что имя пользователя и идентификатор пользователя совпадают в хосте и контейнере Docker - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь запустить Docker-контейнер с пользовательским изображением для данного пользователя. У меня есть entrypoint.sh, который может изменить работающего пользователя в соответствии с переменной окружения, предоставленной в командной строке Docker, с -e USER=myuser.

У меня тот же пользователь на хост-компьютере. Это можно сделать на разных хостах, и я могу гарантировать, что этот пользователь существует на любом хосте, который мы используем. Но у меня проблемы, потому что я не могу гарантировать, что числовой идентификатор для этого пользователя всегда одинаков (скажем, 1001). В командной строке выполнения контейнера Docker я монтирую некоторые локальные папки с -v <src>:<tgt>, а приложение в контейнере создает дополнительные папки и файлы в <tgt>.

Проблема в том, что, хотя пользователь в хосте и контейнере имеют одно и то же имя (скажем, myuser), числовой идентификатор для него может измениться (скажем, например, 5000 в хосте и 1001 в контейнере ), поэтому у меня возникают проблемы при чтении файлов и папок по смонтированному пути.

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

EDIT

Понятно, я не объяснил себя ВСЕ, а перепутал вещи. Я попытаюсь объяснить мою проблему еще раз:

  1. Я создал образ на основе Linux, и в этом образе я: а) установил набор пакетов как root; б) создал определенного пользователя myuser и переключился на него с помощью USER <usr> в Dockerfile; и c) скопировал свое собственное программное обеспечение и установил его в образе как пользователь myuser, и это программное обеспечение должно выполняться этим пользователем.

  2. Я создал того же пользователя myuser на другом компьютере

  3. запустил контейнер из этого образа на другом компьютере и поделился некоторыми папками (принадлежащими пользователю myuser) из файловой системы хоста с этим контейнером.

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

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Если вы используете образ на основе Linux (например, Ubuntu), в вашем Dockerfile вам понадобится что-то вроде

sudo addgroup --gid 3000 mygroupname && 
sudo adduser --uid 4000 --gid 3000 --disabled-password --gecos "" myusername
  1. Я использую 3000 и 4000 в качестве примеров. Они оба могут быть одинаковыми номер, если вы хотите, чтобы они были.
  2. Отключить пароль или нет, зависит от того, что вы хотите сделать с пользователем.
  3. gecos для установки полного имени, номера комнаты, рабочего телефона и т. Д. Для пользователя. Мы устанавливаем их все как пустые. Вы можете определенно установить их на что-то более полезное, если хотите.

Вам придется переключиться на этого пользователя и, возможно, использовать домашний каталог этого пользователя в качестве рабочего каталога. Строки в Dockerfile будут:

USER myusername
WORKDIR /home/myusername
0 голосов
/ 14 сентября 2018

Вы должны указать пользователя в Dockerfile командой USER.Опции -e USER=myuser создадут переменную окружения, но по умолчанию она не изменит пользователя.

Ссылка: https://docs.docker.com/engine/reference/builder/#user

...