Речь идет о довольно технической проблеме использования Docker-контейнеров, которые взаимодействуют с хост-компьютером Docker, обычно связанной с использованием файловой системы хоста внутри контейнера.
Это происходит, в частности, в воспроизводимом исследовательском контексте.
Я разработал утилиту с открытым исходным кодом, которая помогает решить эту проблему.
Первоначальный и основной вариант использования докер-контейнера: автономное приложение, которое взаимодействует с хост-системой только через некоторые сетевые порты.
Представьте себе веб-приложение: Docker-контейнер обычно содержит веб-сервер и веб-приложение, работающее, например, на порту 80 (внутри контейнера). Затем контейнер запускается на хосте путем привязки внутреннего порта 80 контейнера к порту хоста (например, 8000).
Тогда единственное взаимодействие между контейнерным приложением и хост-системой осуществляется через этот привязанный сетевой порт.
Контейнеры как среды выполнения совершенно разные:
Но чтобы использовать эти среды выполнения, эти контейнеры должны иметь доступ к хост-системе, в частности к файловой системе хост-пользователя.
Предположим, вы контейнеризировали IDE, например. Рстудия.
Ваша Rstudio установлена и работает внутри Docker-контейнера, но ей необходимо читать и редактировать файлы в папке вашего проекта.
Для этого вы связываете папку вашего проекта (в файловой системе хоста), используя опцию docker run --volume.
Тогда ваши файлы будут доступны из Docker-контейнера.
Теперь проблема — права доступа к файлам. Предположим, что пользователь вашего хоста имеет идентификатор пользователя 1001, и предположим, что пользователь, владеющий процессом Rsudio в контейнере, является либо 0 (root), либо 1002.
Если пользователем контейнера является root, то у него не возникнет проблем с чтением ваших файлов.
Но как только вы отредактируете некоторые существующие файлы или создадите новые (например, pdf, html), эти файлы будут принадлежать корневому каталогу также в файловой системе хоста!.
Это означает, что ваш локальный пользователь хоста не сможет использовать их или удалить, поскольку они принадлежат пользователю root.
Теперь, если идентификатор пользователя контейнера — 1002, Rstudio может не иметь возможности читать ваши файлы, редактировать их или создавать новые файлы.
Даже если это возможно, установив некоторые очень разрешительные разрешения, пользователь вашего локального хоста может не иметь возможности их использовать.
Конечно, один из способов решения этой проблемы методом грубой силы — запуск с правами root как на главном компьютере, так и в Docker-контейнере. Это не всегда возможно и вызывает некоторые очевидные критические проблемы безопасности.
Поскольку мы не можем заранее знать, какой будет идентификатор пользователя хоста (здесь 1001), мы не можем предварительно настроить
идентификатор пользователя контейнера докеров.
docker run теперь предоставляет параметр --user, который позволяет создать псевдо пользователя с некоторым предоставленным идентификатором пользователя
во время выполнения. Например, docker run --user 1001... создаст докер-контейнер, работающий с процессами
принадлежит пользователю с идентификатором пользователя 1001.
Так что же мы еще обсуждаем этот вопрос? Разве это не решено?
Вот некоторые особенности этого динамически создаваемого пользователя:
Мы можем обойти эти проблемы, но это может быть утомительно и неприятно.
Чего нам действительно хотелось бы, так это предварительно настроить пользователя Docker-контейнера и иметь возможность динамически изменять его идентификатор пользователя во время время выполнения...
docker_userid_fixer — это утилита с открытым исходным кодом, предназначенная для использования в качестве точки входа в Docker для устранения проблемы с идентификатором пользователя, которую я только что поднял.
Давайте посмотрим, как его использовать: вы устанавливаете его в качестве ENTRYPOINT докера, указывая, какого пользователя следует использовать, и динамически изменяете его идентификатор пользователя:
ENTRYPOINT ["/usr/local/bin/docker_userid_fixer","user1"]
Давайте будем точнее:
Затем при создании среды выполнения контейнера есть два варианта:
Так что на практике это решает нашу проблему:
Инструкции по настройке можно найти здесь.
Но все сводится к следующему:
создайте или загрузите крошечный исполняемый файл (17 КБ)
скопируйте его в образ Docker
сделайте его исполняемым с root-правом setuid
настройте его как точку входа
Я добавил несколько коротких заметок https://github.com/kforner/docker_userid_fixer#how-it-works
но я попробую перефразировать.
Суть реализации заключается в корне setuid исполняемого файла docker_userid_fixer в контейнере.
Нам нужны права root для изменения идентификатора пользователя, и этот setuid позволяет это привилегированное выполнение только для
программу docker_userid_fixer, и это на очень короткое время.
Как только идентификатор пользователя будет изменен, если это необходимо, docker_userid_fixer переключит основной процесс
запрошенному пользователю (и идентификатору пользователя!).
Если вас интересуют эти темы (докер, воспроизводимые исследования, разработка пакетов R, алгоритмы, оптимизация производительности, параллелизм...), не стесняйтесь обращаться ко мне, чтобы обсудить возможности трудоустройства и бизнеса.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3