在Docker容器中使用uwsgi和nginx设置Flask应用 [英] Setting flask app with uwsgi and nginx in docker container
问题描述
我正在尝试在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.
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屋!