Запуск uWSGI с супервизором в док-контейнере запрещает разрешение
У меня есть приложение Django, которое я хочу запустить с UWSGI в контейнере Docker с помощью Supervisor.
Я использую OSX, чтобы успешно смонтировать мою файловую систему OSX внутри моего boot2docker
ВМ (так что я могу монтировать тома с помощью докера run -v /source/:/destination
) Я должен был использовать sshfs
Я думаю, что это вызывает некоторые странные права на мою смонтированную файловую систему.
У меня есть два крепления на моем boot2docker
VM; тот, который указывает на кодовую базу моих приложений, и тот, который указывает на произвольное местоположение на моем хосте для записи постоянных журналов в
Host: /Users/username/workspace/project --- > boot2docker: /home/docker/osx
Host: /containers/project --- > boot2docker: /containers/project
Я начинаю свой док-контейнер с:
docker run -t -i -p 80 -v /home/docker/osx/project/www:/var/www -v /containers/project:/host image-name /bin/bash
Моя конфигурация супервизора для моего приложения выглядит следующим образом:
[program:app_name]
command=uwsgi --ini /var/www/wsgi/uwsgi.ini
directory=/var/www
autostart=true
autorestart=true
stdout_logfile=/host/logs/app-name.log
redirect_stderr=True
мой usgi.ini
выглядит так:
[uwsgi]
http = :3041
chdir = /var/www
module = run.wsgi
uid = www-data
gid = 33
master = True
processes = 4
threads = 1
pidfile = /var/run/uwsgi.pid
touch-reload = /var/run/uwsgi.pid
logto = /host/logs/uwsgi.log
Когда я запускаю свое приложение с supervisorctl, я получаю следующие ошибки:
root@4237fd060a40:/var/www# supervisorctl
app_name FATAL Exited too quickly (process log may have details)
supervisor> start app_name
2014-06-15 10:22:16,559 INFO spawned: 'app_name' with pid 105
2014-06-15 10:22:16,633 INFO exited: app_name (exit status 1; not expected)
2014-06-15 10:22:17,658 INFO spawned: 'app_name' with pid 106
app_name: ERROR (abnormal termination)
И в логах uWSGI я вижу:
[uWSGI] getting INI configuration from /var/www/run/uwsgi.ini
*** Starting uWSGI 1.9.10 (64bit) on [Sun Jun 15 10:22:22 2014] ***
compiled with version: 4.6.3 on 13 June 2014 15:25:05
os: Linux-3.14.1-tinycore64 #1 SMP Mon Jun 9 16:21:23 UTC 2014
nodename: 4237fd060a40
machine: x86_64
clock source: unix
detected number of CPU cores: 4
current working directory: /var/www
writing pidfile to /var/run/uwsgi.pid
detected binary path: /usr/local/bin/uwsgi
setgid() to 33
setuid() to 33
chdir(): Permission denied [core/uwsgi.c line 2121]
Бег id -g www-data
показывает мне, что мой джид прав и что www-data
существует:
root@4237fd060a40:/var/www# id -g www-data
33
И внутри моего док-контейнера права доступа к файлам выглядят так:
root@4237fd060a40:/var/www# ll
total 76
drwxr-xr-x 1 10133 10000 578 Jun 15 09:55 ./
drwxr-xr-x 30 root root 4096 Jun 15 09:52 ../
drwxr-xr-x 1 10133 10000 714 Jun 13 10:55 some_folder/
drwxr-xr-x 1 10133 10000 1292 Jun 9 11:29 some_file.py
Итак, потому что я вижу uid
с и gid
Здесь файлы / папки принадлежат несуществующему пользователю (они совпадают с именами пользователей OSX моего хоста) uid
а также gid
), и я получаю ошибки разрешения выше, потому что www-data
пользователь не имеет доступа для записи в смонтированную файловую систему, что я могу доказать, используя su
:
root@4237fd060a40:/var/www# su www-data
$ pwd
/var/www
$ touch test2
touch: cannot touch `test2': Permission denied
Имеет смысл до сих пор, но когда я пытаюсь записать файл как root:
root@4237fd060a40:/var/www# touch test
root@4237fd060a40:/var/www# ll
total 76
...
-rw-r--r-- 1 10133 10000 0 Jun 15 10:20 test
Запись файла работает нормально, и даже имеет право uid
а также gid
,
Итак, я бы ожидал запуск uWSGI от имени пользователя root с этим uwsgi.ini
файл:
[uwsgi]
http = :3041
chdir = /var/www
module = run.wsgi
uid = root
gid = 10000
master = True
processes = 4
threads = 1
pidfile = /var/run/uwsgi.pid
touch-reload = /var/run/uwsgi.pid
logto = /host/logs/uwsgi.log
Или как 10133 с этим uwsgi.ini
файл:
[uwsgi]
http = :3041
chdir = /var/www
module = run.wsgi
uid = 10133
gid = 10000
master = True
processes = 4
threads = 1
pidfile = /var/run/uwsgi.pid
touch-reload = /var/run/uwsgi.pid
logto = /host/logs/uwsgi.log
Будет работать, но я не получаю любви
[uWSGI] getting INI configuration from /var/www/run/uwsgi.ini
*** Starting uWSGI 1.9.10 (64bit) on [Sun Jun 15 10:30:05 2014] ***
compiled with version: 4.6.3 on 13 June 2014 15:25:05
os: Linux-3.14.1-tinycore64 #1 SMP Mon Jun 9 16:21:23 UTC 2014
nodename: 4237fd060a40
machine: x86_64
clock source: unix
detected number of CPU cores: 4
current working directory: /var/www
writing pidfile to /var/run/uwsgi.pid
detected binary path: /usr/local/bin/uwsgi
setgid() to 10000
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
chdir(): Permission denied [core/uwsgi.c line 2121]
А также
[uWSGI] getting INI configuration from /var/www/run/uwsgi.ini
*** Starting uWSGI 1.9.10 (64bit) on [Sun Jun 15 10:30:36 2014] ***
compiled with version: 4.6.3 on 13 June 2014 15:25:05
os: Linux-3.14.1-tinycore64 #1 SMP Mon Jun 9 16:21:23 UTC 2014
nodename: 4237fd060a40
machine: x86_64
clock source: unix
detected number of CPU cores: 4
current working directory: /var/www
writing pidfile to /var/run/uwsgi.pid
detected binary path: /usr/local/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
setgid() to 10000
setuid() to 10133
chdir(): Permission denied [core/uwsgi.c line 2121]
Что мне не хватает?
1 ответ
Я видел ошибки, в которых отказано в разрешении, потому что guid
не существовало внутри контейнера.
Изменение линии guid=10000
в guid=root
починил это.