@Vigilo
Infernal Server Error

Как правильно работать с пользователями в Docker-контейнерах?

Пытался вникнуть самостоятельно, но не хватает то ли усердности, то ли опыта с докер-контейнерами.

Как работает параметр user при запуске докер-контейнеров и, самое главное - как обрабатывать его при написании своих Dockerfile'ов?

На данный момент видел готовые контейнеры с обработкой параметра (например, mariadb) - но при этом часто при первом запуске он перетаскивает права в настроенном волюме на uid=999 (system-coredump) - от чего впечатление, что user не работает как некий "прокси для прав", заставляя все "внешние взаимодействия" осуществлять из под указанного user'а.

В самосборных контейнерах (например, проектах с использованием php-fpm и внешними волюмами) пока что передают в env-переменные значения UID=xxxx и GID=xxxx, которые обрабатываются entrypoint'ом, создавая юзера внутри контейнера с нужными ID и запуская fpm от него.
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
gecube
@gecube
системный администратор, программист... все дела..
> Как работает параметр user при запуске докер-контейнеров и, самое главное - как обрабатывать его при написании своих Dockerfile'ов?

никак. Параметр user это костыль, который позволяет софт запускать не от root'ового пользователя. Объяснять почему запускать в докере под пользователем 0 (root) что-либо - долго, но если кратко, то это очень плохо и не секурно. Соответственно, правильный путь Вы уже поняли:

  1. определять entrypoint контейнера как свой самописанный docker-entrypoint.sh скрипт
  2. в docker run оставить возможность передать ключ (точнее - переменную среды) USER
  3. в docker-entrypoint.sh его (ее, переменную среды) подхватывать и изменять через chmod/chown нужные файлы в bind-mount (каталогах, доступных и в контейнере, и на хосте) и через утилиту gosu переключаться в нужного пользователя
  4. и только как завершающий этап - запускать свой сервис в докере


Что еще добавить. Все эти проблемы с chown/chmod возникают только если необходимо перегонять файлы между контейнером и хостом. Если этой задачи не стоит, то и все приседания и не нужны. А если все-таки нужно, то есть еще два способа это сделать без колдования с правами:
  • команда docker cp
  • использование pipe: docker exec container_name cat MY_FILE > path_on_host или аналогично
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
planc
@planc
user - это словесное представление для удобства, как домены в интернете
у файла нет параметра имя юзера, имя группы юзера, там как ip адреса - номер юзера и номер группы юзера

допустим я юзер dka на хосте uid/gid 1000

у меня папка /tmp/docker с кодом

я запускаю дебиан в контейнере и добавляю туда свою папку, которая будет /code
docker run -v /tmp/docker:/code -it --rm debian bash


создаю юзера внутри контейнера с uid 1000 gid 1000 ( как у моего юзера на хосте)
root@364785fa76ce:/code# groupadd -g 1000 my_docker_user_group
root@364785fa76ce:/code# useradd --uid 1000 --gid 1000 my_docker_user


прыгаю под нового юзера с помощью su (в докер файле это директива USER)

root@364785fa76ce:/code# su my_docker_user

все, теперь я могу кодить на хосте, а запускать в контейнере и у меня не будет проблем с правами на файлы
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
21 авг. 2019, в 12:50
30000 руб./за проект
21 авг. 2019, в 12:03
3000 руб./в час
21 авг. 2019, в 11:44
750 руб./в час