Flask在Docker中运行。每次都需要重建

时间:2018-07-27 13:05:50

标签: docker flask docker-compose

我正在尝试构建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服务器的自动重装。关于如何调试有任何想法吗?

1 个答案:

答案 0 :(得分:0)

在Docker之外的主机上对其进行调试。如果需要访问在Docker中运行的数据库,则可以将环境变量MYSQL_HOSTPGHOST设置为指向localhost。您根本不需要root用户特权(任何docker命令都意味着不受限制的root用户访问权限)。您的IDE不会因您在其他位置使用不同文件系统布局运行的代码而感到不安。如果您有远程调试器,则无需遍历Docker分区即可访问它。

一旦它在主机上合理运行并且您的py.test测试通过,然后运行docker build

(在服务器呈现的视图的特定情况下,您应该能够通过Flask调试服务器看到几乎完全相同的东西,而无需在其前面安装nginx代理,并且您可以控制已安装的库版本通过setup.py文件中的需求。因此,桌面环境将更加简单,您应该可以说服自己,它与Docker世界中正在运行的东西非常接近。)