说来惭愧,写了好几个flask django项目都是在原型阶段直接python app.py 运行的,涉及到部署用nginx和gunicorn 都是让别人帮我部署的,听说好像说很麻烦的样子,我就没本身作。python
如今本身有时间了,搞了一下,发现也没什么复杂的,花半天搞定。哞哈哈哈。nginx
心得:git
1 不要怕。(要么怕满屏洋文,要么怕新知识新技术一个坑接一个坑。其实比看论文/写论文容易多了吧!)由于怕而逃避,拖延,最要不得github
2 不要本身zuan3。技术问题若是路数不对,可能很吃时间,搞N天搞不定;但其实都是一层窗户纸。docker
不是搞科研,犯不上本身再发明一遍轮子耽误时间。其实搞研究同样要多读别人的文献,技术就更须要多读多练了。空想空谈的“空疏”,比学了一堆技能的“支离”更要不得。django
1 彻底不懂的技术框架,有官方文档看官方文档和demoflask
2几种本身不太懂的技术配合的解决方案组合问题,如“OO+XX”这种:先去github找现成的solutionubuntu
3 1和2照作中,遇到具体问题,先stackoverflow,没有再googleapi
要善于借助外网的力量,并造成习惯。缓存
github上有现成的demo,仍是比较容易的。我fork下来,又稍微修改了几点,厚脸皮pull request了。
# nginx-gunicorn-flask with python3 FROM python LABEL author="" LABEL purpose = '' RUN apt update RUN apt install -y nginx supervisor RUN pip3 install gunicorn RUN pip3 install setuptools ENV PYTHONIOENCODING=utf-8 # Build folder RUN mkdir -p /deploy/app WORKDIR /deploy/app #only copy requirements.txt. othors will be mounted by -v COPY app/requirements.txt /deploy/app/requirements.txt RUN pip3 install -r /deploy/app/requirements.txt # Setup nginx RUN rm /etc/nginx/sites-enabled/default COPY nginx_flask.conf /etc/nginx/sites-available/ RUN ln -s /etc/nginx/sites-available/nginx_flask.conf /etc/nginx/sites-enabled/nginx_flask.conf RUN echo "daemon off;" >> /etc/nginx/nginx.conf # Setup supervisord RUN mkdir -p /var/log/supervisor COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY gunicorn.conf /etc/supervisor/conf.d/gunicorn.conf # run sh. Start processes in docker-compose.yml #CMD ["/usr/bin/supervisord"] CMD ["/bin/bash"]
和原做者不一样的几处修改,说明一下:
官方源如今也能够apt update 也带了pip3了,只不过setuptools仍是要手动装(MD都装利索了会死啊),就不必本身用ubuntu装python3.6了
dockerfile语法有些过期了,改为LABEL author了
把gunicorn改为了用pip3安装,而不是apt安装,不然,用supervisord运行,会报错:
gunicorn gunicorn (exit status 1; not expected)
或者
FATAL Exited too quickly (process log may have details)
原做者是在build镜像的时候把代码全都COPY进去了,我改为只copy requirements.txt 用于安装python包就能够了。代码之类的我仍是喜欢用-v挂载。
结尾,把 supervisord 改为bash。由于不免要调试一下。这样起container以后,attach进去能够手动启动flask。
把自动的supervisord 放在docker-compose.yml里,更灵活一些。
几个配置文件,其实没有太多可说的:
server { listen 80; location / { proxy_pass http://localhost:5000/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ^~ /static/ { root /deploy/app/; } }
照着别人的demo增长static(其实不加的话,是否是也能缓存呢?)
注意^~ 有空格 和路径写法 root /deploy/app/ 不要多写static
[program:gunicorn] command=gunicorn --workers=3 app:app -b localhost:5000 directory=/deploy/app
[supervisord] nodaemon=true [program:nginx] command=/usr/sbin/nginx
而后,用docker-compose管理容器
version: "3.3"
services:
api:
#restart: always
stdin_open: true
tty: true
build: ./dockerfile
image: nginx-gunicorn-flask:latest
volumes:
- ./app:/deploy/app
- ./nginx_flask.conf:/etc/nginx/sites-available/nginx_flask.conf
- ./gunicorn.conf:/etc/supervisor/conf.d/gunicorn.conf
- ./supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
ports:
- "80:80"
#command: '/bin/bash'
command: '/usr/bin/supervisord'
若是是调试,不但愿自动运行,就把最后一句command注释了。启动以后attach进去
4个挂载点,第1个是所有代码;后面是3个conf文件,各挂到各自该去的地方。
惟一注意的是这种挂单文件的时候,冒号先后不能加空格,不然报错。(以前实验了绝对路径,加双引号。。。觉得是yml版本过低…但都不对),如今这样写最简单。
如今这样启动以后,代码在host,用IDE修改代码后,容器里躲在Nginx和gunicorn以后的flask同样自动热更新,oyeah!