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