在Docker容器中使用uwsgi和nginx设置Flask应用 [英] Setting flask app with uwsgi and nginx in docker container

查看:68
本文介绍了在Docker容器中使用uwsgi和nginx设置Flask应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Docker容器中运行包含flask,uwsgi和nginx的Docker容器.

I'm trying to run a Docker container with flask, uwsgi and nginx in a docker container.

我的Dockerfile看起来是这样的:

my Dockerfile looks so:

FROM ubuntu:16.04

MAINTAINER Dockerfiles

# Install required packages and remove the apt packages cache when done.
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y \
    ...
    
# install uwsgi 
RUN pip3 install uwsgi

# copy over requirements.txt file
COPY requirements.txt /home/docker/code/

# upgrade pip and install required python packages
RUN pip3 --no-cache-dir install -U pip
RUN pip3 --no-cache-dir install -r /home/docker/code/requirements.txt

# add (the rest of) our code
COPY ./app /home/docker/code/

# create a systemd unit file
COPY ./app.service /etc/systemd/system/  # Think the problem is here

# start the uwsgi service
RUN systemctl start app  # This is not working
RUN systemctl enable app

# setup all the configfiles
COPY nginx_app /etc/nginx/sites-available/

# enable nginx server block
RUN ln -s /etc/nginx/sites-available/nginx_app /etc/nginx/sites-enabled

# validate syntax
CMD ["nginx", "-t"]

# restart nginx
RUN systemctl restart nginx

# allow nginx
RUN ufw allow 'Nginx Full'

然后是我的app.service:

and then my app.service so:

[Unit]
Description=uWSGI instance to serve app
After=network.target

[Service]
User=docker
Group=www-data
WorkingDirectory=/home/docker/code
ExecStart=/usr/local/bin/uwsgi --ini uwsgi.ini

[Install]
WantedBy=multi-user.target

nginx配置

server {
    listen 80;
    server_name my_server_ip;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/docker/code/myproject.sock;
    }

然后是我的uwsgi.ini

then my uwsgi.ini

[uwsgi]
module = wsgi:app

master = true
processes = 5

socket = app.sock
chmod-socket = 664
vacuum = true

die-on-term = true

但是当我尝试构建它时,出现此错误

But when I try to build it, I get this error

第12步:运行systemctl启动应用程序

Step 12 : RUN systemctl start app

--->在79a22c2629db中运行

---> Running in 79a22c2629db

无法连接到总线:没有这样的文件或目录

failed to connect to bus: No such file or directory

INFO [0022]命令[/bin/sh -c systemctl start app]返回了非零代码:1

INFO[0022] The command [/bin/sh -c systemctl start app] returned a non-zero code: 1

我正在阅读,我认为问题出在systemd.我应该使用主管.但是我不知道怎么做.

I was reading and I think that the problem is with the systemd. I should use supervisord. But I don't have a clue how to do it.

在正常"情况下服务器,我可以运行这些命令,并且可以运行,但是在Docker容器中无法运行.

On a "normal" server I could run those commands and it would work, but in a docker container is not working.

仅"我遇到的问题是我必须使用uwsgi和nginx运行我的应用程序,但我不明白.

The "only" problem I've is that I have to run my app with uwsgi and nginx but I don't get it.

我在Internet上阅读了许多帖子和教程,还尝试更改

I read many posts and tutorials on Internet and also tried to change this project but it still not working and I'd prefer to use my dockerfile (this one) because it's what I understand.

推荐答案

我找到了答案.

我在主管的指导下解决了这个问题.

I resolved it with supervisord.

# install uwsgi now because it takes a little while
RUN pip3 install uwsgi

# setup all the configfiles
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
COPY nginx_app.conf /etc/nginx/sites-available/default
COPY supervisor_app.conf /etc/supervisor/conf.d/


# copy over our requirements.txt file
COPY requirements.txt /home/docker/code/

# upgrade pip and install required python packages
RUN pip3 --no-cache-dir install -U pip
RUN pip3 --no-cache-dir install -r /home/docker/code/requirements.txt

# add (the rest of) our code
COPY ./app /home/docker/code/

EXPOSE 80
CMD ["supervisord"]

然后supervisor_app.conf看起来是

and then the supervisor_app.conf looks so

[supervisord]
nodaemon=true

[program:uwsgi]
command = /usr/local/bin/uwsgi --ini /home/docker/code/uwsgi.ini
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:nginx]
command = /usr/sbin/nginx
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

uwsg.ini

[uwsgi]
callable = app
chdir = /home/docker/code/
wsgi-file = /home/docker/code/wsgi.py
socket = /home/docker/code/app.sock
master = true
processes = 2
chmod-socket = 666
enable-threads = true

和我的nginx_app.conf

and my nginx_app.conf

server {
    listen 80 default_server;
    server_name my_ip;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/docker/code/app.sock;
    }
}

就这样

这篇关于在Docker容器中使用uwsgi和nginx设置Flask应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆