我正在尝试构建Flask Docker构建体,以便能够从运行用于生产的uWSGI + Nginx切换到仅运行flask run
进行本地开发。
我在开发模式下运行了Flask:
这是我的Dockerfile:
FROM python:3
RUN apt-get -qq update
RUN apt-get install -y supervisor nginx
RUN pip install uwsgi
# Expose dev port
EXPOSE 5000
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY nginx.conf /etc/nginx/sites-enabled/default
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN pip install --editable .
CMD [ "supervisord" ]
我要暴露从docker-compose.yml
运行的端口5000:
version: '3'
services:
web:
build: ./
environment:
DATABASE_URL: postgresql://postgres@db/postgres
FLASK_APP: app.main
FLASK_ENV: development
command: flask run --host=0.0.0.0
ports:
- "5000:5000"
links:
- db
volumes:
- .:/app
db:
image: postgres
restart: always
ports:
- 5433:5432
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
driver: local
我可以构建它并在http://0.0.0.0:5000/
上正常运行,但是如果我更改视图,模板中的任何代码,视图或模板,则服务器上没有任何内容被刷新/重新加载,而我被迫重新构建。
我认为通过在docker-compose中指定FLASK_ENV: development
,可以启用Flask服务器的自动重装。关于如何调试有任何想法吗?
答案 0 :(得分:0)
在Docker之外的主机上对其进行调试。如果需要访问在Docker中运行的数据库,则可以将环境变量MYSQL_HOST
或PGHOST
设置为指向localhost
。您根本不需要root用户特权(任何docker
命令都意味着不受限制的root用户访问权限)。您的IDE不会因您在其他位置使用不同文件系统布局运行的代码而感到不安。如果您有远程调试器,则无需遍历Docker分区即可访问它。
一旦它在主机上合理运行并且您的py.test
测试通过,然后运行docker build
。
(在服务器呈现的视图的特定情况下,您应该能够通过Flask调试服务器看到几乎完全相同的东西,而无需在其前面安装nginx代理,并且您可以控制已安装的库版本通过setup.py
文件中的需求。因此,桌面环境将更加简单,您应该可以说服自己,它与Docker世界中正在运行的东西非常接近。)