Медленное создание экземпляра модели django с помощью Docker

У меня есть приложение django с некоторой моделью. У меня есть команда manage.py, которая создает модели n и сохраняет ее в db. Он работает с приличной скоростью на моей главной машине.

Но если я запустил его в докере, он работает очень медленно, 1 экземпляр создается и сохраняется за 40-50 секунд. Я думаю, что у меня что-то не хватает на том, как работает 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

Ответ 1

Проблема здесь, скорее всего, в том объеме /usr/local/var/postgres:/var/lib/postgresql, поскольку вы используете его на Mac. Поскольку я понимаю решение Docker для Mac, он использует общий доступ к файлам для реализации томов хоста, что намного медленнее, чем доступ к собственной файловой системе.

Возможным обходным решением является использование тома докера вместо хоста. Вот пример:

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. Вы можете использовать CLI или контейнеры докеров для доступа, изменения и резервного копирования этих данных. Кроме того, я не уверен, что произойдет, если вы удалите Docker с вашего Mac, возможно, вы потеряете эти данные.

Ответ 2

Две вещи могут быть вероятной причиной:

  • Запуск контейнера докера занимает некоторое время, поэтому, если вы начинаете новый контейнер для каждого экземпляра, это может складываться.
  • Какой драйвер хранения вы используете? Докере (часто) по умолчанию используется драйвер хранилища карт памяти устройства, который медленный. Вот некоторый контекст. Это будет болезненно, особенно если вы часто начинаете этот контейнер.

Кроме того, ваша конфигурация выглядит разумно, и там нет очевидных причин. Поэтому, если указанные выше два пункта не относятся к вам, добавьте дополнительные комментарии - например, как вы действительно добавляете эти экземпляры модели.