Выполнение как пользователь узла в контейнере Докера

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

Принятие я работаю над приложением Фляги в app.py с зависимостями в requirements.txt, рабочий поток примерно походил бы на это:

# I am "robin" and I am in the docker group
$ whoami
robin
$ groups
robin docker

# Install dependencies into a docker volume
$ docker run -ti -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local python:3-slim pip install -r requirements.txt
Collecting Flask==0.12.2 (from -r requirements.txt (line 1))
# ... etc.

# Run the app using the same docker volume
$ docker run -ti -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -e FLASK_APP=app.py -e FLASK_DEBUG=true -p 5000:5000 python:3-slim flask run -h 0.0.0.0
 * Serving Flask app "app"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 251-131-649

Теперь у нас есть локальный сервер, запускающий наше приложение, и мы можем внести изменения в локальные файлы, и сервер обновится по мере необходимости.

В вышеупомянутом примере приложение заканчивает тем, что работало как root пользователь. Это не проблема, если приложение не записывает файлы обратно в рабочий каталог. Если это делает затем, мы могли бы закончить с файлами (например, что-то как cache.sqlite или debug.log) в нашем рабочем каталоге, принадлежавшем root. Это вызвало много проблем для пользователей в нашей команде.

Для наших других приложений мы решили это путем запуска приложения с UID пользователя узла и GID - например, для приложения Django:

$ docker run -ti -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -p 8000:8000 python:3-slim ./manage.py runserver

В этом случае приложение будет работать как несуществующий пользователь с идентификатором 1000 в контейнере, но любых файлах, записанных в каталог хоста, заканчиваются правильно принадлежавшие robin пользователь. Это хорошо работает в Django.

Однако Фляга отказывается работать как несуществующий пользователь (в режиме отладки):

$ docker run -ti -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -e FLASK_APP=app.py -e FLASK_DEBUG=true -p 5000:5000 python:3-slim flask run -h 0.0.0.0
 * Serving Flask app "app"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
Traceback (most recent call last):
...
  File "/usr/local/lib/python3.6/getpass.py", line 169, in getuser
    return pwd.getpwuid(os.getuid())[0]
KeyError: 'getpwuid(): uid not found: 1000'

Делает любой знает, существует ли какой-либо способ, которым я мог также:

  • Заставьте Флягу не волноваться о неназначенном идентификаторе пользователя, или
  • Так или иначе динамично присвойте идентификатор пользователя имени пользователя во времени выполнения, или
  • Иначе позвольте приложению докера создавать файлы на хосте как пользователь узла?

Единственное решение, о котором я могу думать прямо сейчас (супер hacky) состоит в том, чтобы изменить полномочия /etc/passwd в докере отображают, чтобы быть глобально записываемым, и затем добавить новую строку к тому файлу во времени выполнения для присвоения новой пары UID/GID имени пользователя.

3
задан 23 August 2017 в 01:17

1 ответ

Этот ответ был отправлен на StackOverflow Robert:


Можно совместно использовать passwd файл хоста:

docker run -ti -v /etc/passwd:/etc/passwd -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -p 8000:8000 python:3-slim ./manage.py runserver

Или, добавьте пользователя к изображению с useradd, использование /etc как объем, таким же образом Вы используете /usr/local:

docker run -v etcvol:/etc python..... useradd -u `id -u` $USER

(Оба id -u и $USER разрешены в оболочке хоста, прежде чем докер получит команду),

0
ответ дан 1 December 2019 в 20:46

Другие вопросы по тегам:

Похожие вопросы: