Работа в качестве хост-пользователя в контейнере Docker

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

Предполагая, что я работаю над флеш-приложением на 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.

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

$ 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'

Кто-нибудь знает, есть ли способ, которым я может также:

Make Flask не беспокоиться о неназначенном идентификаторе пользователя или как-то динамически назначать идентификатор пользователя для имени пользователя во время выполнения или иначе разрешить приложению-докере создавать файлы на хосте в качестве хост-пользователя ?

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

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

3 ответа

Этот ответ был отправлен в 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
ответ дан 22 May 2018 в 19:10

Этот ответ был отправлен в 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
ответ дан 18 July 2018 в 08:05

Этот ответ был отправлен в 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
ответ дан 24 July 2018 в 18:59

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

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