【问题标题】:Flask in docker working very slowly and not synch filesdocker中的烧瓶工作非常缓慢并且不同步文件
【发布时间】:2021-12-03 10:28:32
【问题描述】:

我在 docker 中使用烧瓶应用程序有 2 个问题。应用程序运行缓慢并在完成最后一个请求后冻结(例如:第一条路线工作正常,然后单击其他链接/页面应用程序冻结。如果我通过 URL 转到主页并再次运行页面工作正常)。外部 docker 应用程序运行速度非常快。 第二个问题是docker在更改文件后不同步容器中的文件。

# Dockerfile

FROM python:3.9

# set work directory
WORKDIR /base

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apt-get update

RUN pip install --upgrade pip
COPY ./requirements.txt /base/requirements.txt
COPY ./base_app.py /base/base_app.py
COPY ./config.py /base/config.py
COPY ./certs/ /base/certs/
COPY ./app/ /base/app/
COPY ./tests/ /base/tests/
RUN pip install -r requirements.txt

# docker-compose
version: '3.3'

services:
  web:
    build: .
    command: tail -f /dev/null
    volumes:
      - ${PWD}/app/:/usr/src/app/
    networks:
      - flask-network
    ports:
      - 5000:5000
    depends_on:
      - flaskdb

  flaskdb:
    image: postgres:13-alpine
    volumes:
      - ${PWD}/postgres_database:/var/lib/postgresql/data/
    networks:
      - flask-network
    environment:
      - POSTGRES_DB=db_name
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    ports:
      - "5432:5432"
    restart: always

networks:
   flask-network:
        driver: bridge
`

【问题讨论】:

    标签: docker flask docker-compose dockerfile


    【解决方案1】:

    您显示的代码中有几个重大错误。

    第一个问题是您的应用程序根本没有运行:Dockerfile 缺少告诉 Docker 运行什么的 CMD 行,并且您在 Compose 设置中使用无意义的 tail 命令覆盖它。您通常应该在 Dockerfile 中进行设置:

    CMD ["./base_app.py"]
    

    您可以删除您拥有的大部分 Compose 设置。你不需要command:(它在Dockerfile中),volumes:(你所拥有的是无效的,代码在图像中)或networks:(Compose提供了一个名为default的网络;删除所有文件中的networks:块)。

    第二个问题是docker在更改文件后不同步容器中的文件。

    我通常不建议尝试在 Docker 中进行实际开发。您可以告诉 Compose 只启动数据库

    docker-compose up -d flaskdb
    

    然后您可以从主机(PGHOST=localhostPGPORT=5432)访问它。这意味着您可以使用普通的非 Docker Python 虚拟环境进行开发。

    如果您确实想尝试使用volumes: 来模拟实时开发环境(您谈论的是性能;此特定路径在非 Linux 主机上可能会很慢),那么您需要确保 left volumes: 一侧是您的代码所在的主机目录(可能是 .),右侧 一侧是容器目录(您的 Dockerfile 使用 /base),而您的 Dockerfile 没有'根本不重新排列、修改或生成文件(绑定挂载隐藏了所有文件)。

    # don't run the application in the image; use the Docker infrastructure
    # to run something else
    volumes:
      # v-------- left side: host path (matches COPY source directory)
      - .:/base
      #    ^^^^-- right side: container path (matches WORKDIR/destination directory)
    

    【讨论】:

    • 我添加了 tail 因为到目前为止我在容器内手动运行应用程序。我从 docker-compose 删除网络并更改卷( .:/base )。我知道实时刷新速度较慢。但即使是我的另一个 django 应用程序的运行速度也比这个快很多倍:(
    猜你喜欢
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2019-06-08
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多