Django и uWSGI в контейнере Docker

Я пытаюсь запустить проект, который использует Django и uWSGI в контейнере Docker. Но я новичок в Docker и uWSGI, поэтому я не совсем уверен, как я должен это делать.

Сначала я построил проект с помощью этой команды:

docker build -t saleor .

Затем я запустил это:

docker run --env SECRET_KEY="<the key>" -p 4000:80 saleor

И вот что я получаю:

[uWSGI] getting INI configuration from /app/saleor/wsgi/uwsgi.ini
[uwsgi-static] added mapping for /static => /app/static
*** Starting uWSGI 2.0.15 (64bit) on [Tue Dec 19 14:02:19 2017] ***
compiled with version: 4.9.2 on 19 December 2017 09:11:22
os: Linux-4.10.0-42-generic #46~16.04.1-Ubuntu SMP Mon Dec 4 15:57:59 UTC 2017
nodename: 88adfd3f2e93
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 4
current working directory: /app
detected binary path: /usr/local/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
your memory page size is 4096 bytes
detected max file descriptor number: 1048576
building mime-types dictionary from file /etc/mime.types...547 entry found
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8000 fd 3
Python version: 3.5.4 (default, Dec 12 2017, 16:43:39)  [GCC 4.9.2]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x12277b0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 145536 bytes (142 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x12277b0 pid: 1 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 1)
spawned uWSGI worker 1 (pid: 10, cores: 1)

Теперь я не знаю, что я должен делать. Обычно с приложениями Django я бы просто проверял localhost:4000 в моем браузере. Но это не работает в этом случае, и я ничего не получаю. Так что мне делать?

3 ответа

Я просто кое-что понял. "Docker run" запускает только один контейнер. Но некоторые проекты используют несколько контейнеров для разных сервисов (таких как этот), и для них следует использовать docker-compose. Проблема заключалась в том, что база данных была просто в другом контейнере. Таким образом, использование "docker-compose up" решило проблему.

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

Когда вы запускаете команду

docker build -t saleor .

Это означает, что вы строите с помощью Dockerfile, когда к процессу добавлены пользователь и группа.

RUN groupadd -r saleor && useradd -r -g saleor saleor

а также каталог принадлежит этому пользователю / группе: saleor / saleor

RUN mkdir -p /app/media /app/static  && chown -R saleor:saleor /app/

Вам нужно добавить: --user saleor:saleor в docker run, поэтому uWSGI не будет работать от имени пользователя root

docker run --env SECRET_KEY="<the key>" -p 4000:8000 --user saleor:saleor saleor

Затем http://localhost:4000/ должен работать нормально. Вот вывод:

[uWSGI] getting INI configuration from /app/saleor/wsgi/uwsgi.ini
[uwsgi-static] added mapping for /static => /app/static
*** Starting uWSGI 2.0.17.1 (64bit) on [Tue Mar 12 15:10:03 2019] ***
compiled with version: 6.3.0 20170516 on 08 February 2019 17:14:12
os: Linux-4.4.0-142-generic #168~14.04.1-Ubuntu SMP Sat Jan 19 11:26:28 UTC 2019
nodename: xxxxxx
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /app
detected binary path: /usr/local/bin/uwsgi
your processes number limit is 524288
your memory page size is 4096 bytes
detected max file descriptor number: 524288
building mime-types dictionary from file /etc/mime.types...554 entry found
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :4000 fd 3
Python version: 3.6.8 (default, Feb  6 2019, 03:44:09)  [GCC 6.3.0 20170516]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x5XX
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 364600 bytes (356 KB) for 4 cores
*** Operational MODE: preforking ***
WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x5XX pid: 1 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 1)
spawned uWSGI worker 1 (pid: 9, cores: 1)
spawned uWSGI worker 2 (pid: 10, cores: 1)
spawned uWSGI worker 3 (pid: 11, cores: 1)
spawned uWSGI worker 4 (pid: 12, cores: 1)

Я не привык к докеру. Вы знаете, откуда вы берете источник?

https://github.com/mirumee/saleor-demo

Например, здесь я могу увидеть в Dockerfile

EXPOSE 8000
ENV PORT 8000

И в Django сервер тоже указывает на 8000 (см. Docker-compose.yml)

Я бы попробовал:

docker run --env SECRET_KEY="<the key>" -p 4000:8000 saleor

и слушать порт 4000

curl http://localhost:4000

Порт 5432 кажется портом postgres

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