В моей команде мы используем контейнеры Докера для локального запуска наших приложений веб-сайта, в то время как мы делаем разработку на них.
Принятие я работаю над приложением Фляги в 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 имени пользователя.
Этот ответ был отправлен на 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 разрешены в оболочке хоста, прежде чем докер получит команду),