Это, скорее всего, связано с тем, как вы вызываете серверы в Dockerfile:
CMD gunicorn -b 0.0.0.0:5000 app:app --daemon && \
sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/conf.d/default.conf && \
nginx -g 'daemon off;'
Я подозреваю, что с этой строкой CMD
, nginx на самом деле не будет работать, пока * Процесс 1005 * успешно завершен, что, так как он работает на сервере, не будет.
Правильный способ создать это - иметь отдельный Dockerfile для сервера gunicorn и сервера nginx. Вы пытаетесь упаковать слишком много в один Dockerfile. Каждый контейнер должен запускать один процесс!
Затем вы должны определить их как отдельные службы в файле docker-compose.yml
:
services:
flask:
build:
context: .
dockerfile: Dockerfile-flask
nginx:
build:
context: .
dockerfile: Dockerfile-nginx
В каждом контейнере имя службы ( это flask
и nginx
) может использоваться для доступа к другому контейнеру вместо имени хоста. Таким образом, в конфигурации nginx, где вы делаете строки proxy_pass
, вы можете получить что-то вроде:
location /ping {
proxy_pass http://flask:5000;
}
Также, вероятно, нет смысла в этой строке sed
, которая перезаписывает default.conf
в измените номер порта nginx. Я хотел бы использовать в конфигурации порт stati c nginx, а затем, когда вы выполните команду run, просто документально подтвердите, что пользователь знает, что ему нужно сопоставить свой собственный предпочтительный внешний порт с портом вашего nginx. сервер.
Это также позволит избежать необходимости передавать PORT в качестве переменной среды.