Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Docker缓慢创建django模型实例_Python_Django_Postgresql_Docker - Fatal编程技术网

Python 使用Docker缓慢创建django模型实例

Python 使用Docker缓慢创建django模型实例,python,django,postgresql,docker,Python,Django,Postgresql,Docker,我有一些模型的django应用程序。我有manage.py命令,该命令创建n模型并将其保存到数据库中。它在我的主机上以相当快的速度运行 但如果我在docker中运行它,它运行得非常慢,在40-50秒内创建并保存了一个实例。我想我在Docker的工作原理上遗漏了一些东西,有人能指出为什么性能很低,我能用它做些什么吗 docker compose.yml: version: '2' services: db: restart: always image: "postgres:9

我有一些模型的django应用程序。我有
manage.py
命令,该命令创建
n
模型并将其保存到数据库中。它在我的主机上以相当快的速度运行

但如果我在docker中运行它,它运行得非常慢,在40-50秒内创建并保存了一个实例。我想我在Docker的工作原理上遗漏了一些东西,有人能指出为什么性能很低,我能用它做些什么吗

docker compose.yml

version: '2'

services:
  db:
    restart: always
    image: "postgres:9.6"
    ports:
      - "5432:5432"
    volumes:
      - /usr/local/var/postgres:/var/lib/postgresql
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=my_db
      - POSTGRES_USER=postgres

  web:
    build: .
    command: bash -c "./wait-for-it.sh db:5432 --timeout=15; python manage.py migrate; python manage.py runserver 0.0.0.0:8000; python manage.py mock 5"
    ports:
      - "8000:8000"
    expose:
      - "8000"
    depends_on:
      - db
FROM python:3.6
ENV PYTHONBUFFERED 1
ADD . .
WORKDIR .
RUN pip install -r requirements.txt
RUN chmod +x wait-for-it.sh
用于web服务的dockerfile

version: '2'

services:
  db:
    restart: always
    image: "postgres:9.6"
    ports:
      - "5432:5432"
    volumes:
      - /usr/local/var/postgres:/var/lib/postgresql
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=my_db
      - POSTGRES_USER=postgres

  web:
    build: .
    command: bash -c "./wait-for-it.sh db:5432 --timeout=15; python manage.py migrate; python manage.py runserver 0.0.0.0:8000; python manage.py mock 5"
    ports:
      - "8000:8000"
    expose:
      - "8000"
    depends_on:
      - db
FROM python:3.6
ENV PYTHONBUFFERED 1
ADD . .
WORKDIR .
RUN pip install -r requirements.txt
RUN chmod +x wait-for-it.sh

有两件事可能是原因:

  • 启动docker容器需要一些时间,所以如果您为每个实例启动新容器,这可能会增加
  • 您使用什么存储驱动程序?Docker(通常)默认为设备映射器环回存储驱动程序,速度较慢。这是。这将是痛苦的,尤其是如果你经常启动这个容器
    除此之外,您的配置看起来很合理,并且没有明显的问题原因。因此,如果以上两点不适用于您,请添加一些额外的注释——比如您实际如何添加这些模型实例

    这里的问题很可能是在Mac上使用的卷
    /usr/local/var/postgres:/var/lib/postgresql
    。据我所知,Docker for Mac解决方案使用文件共享来实现主机卷,这比本机文件系统访问慢得多

    一种可能的解决方法是使用docker卷而不是主机卷。以下是一个例子:

    version: '2'
    
    volumes:
      postgres_data:
    
    services:
      db:
        restart: always
        image: "postgres:9.6"
        ports:
          - "5432:5432"
        volumes:
          - postgres_data:/var/lib/postgresql
        environment:
          - POSTGRES_PASSWORD=postgres
          - POSTGRES_DB=my_db
          - POSTGRES_USER=postgres
    
      web:
        build: .
        command: bash -c "./wait-for-it.sh db:5432 --timeout=15; python manage.py migrate; python manage.py runserver 0.0.0.0:8000; python manage.py mock 5"
        ports:
          - "8000:8000"
        expose:
          - "8000"
        depends_on:
          - db
    

    请注意,这可能会使postgres数据的管理复杂化,因为您不能简单地从Mac访问数据。您只能使用docker CLI或容器来访问、修改和备份此数据。另外,我不确定如果你从Mac上卸载Docker会发生什么,可能是因为你丢失了这些数据。

    你是在服务器/VM上这样做的吗?试图在没有docker的情况下在同一台机器上完成这项工作?@lorenzvth7使用最大的计算资源在本地机器(mac)上完成这项工作。在没有docker的情况下执行此操作要快得多。卸载docker不会丢失数据。我有一套专为postgres+django设计的卷集,非常完美