сборка docker очень медленная даже с простыми командами

Я создаю изображение докера на моем Raspberry Pi, что, конечно, занимает некоторое время. Проблема здесь в том, что даже очень простые команды в Dockerfile, такие как установка переменной среды, используя chmod +x на один файл или подвергая порт 80 занимает несколько минут, чтобы завершить.

вот выдержка из моего файла Docker:

FROM resin/rpi-raspbian
MAINTAINER felixbr <mymail@redacted.com>

RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -y python python-dev python-pip python-numpy python-scipy python-mysqldb mysql-server redis-server nginx dos2unix poppler-utils

COPY requirements.txt /app/

RUN pip install -r /app/requirements.txt

COPY . /app

WORKDIR /app

RUN cp /app/nginx-django.cfg /etc/nginx/sites-enabled/default
RUN chmod +x /app/start.sh

ENV DOCKERIZED="true"

CMD ./start.sh

EXPOSE 80

имейте в виду, что это с помощью ARMv6 базовое изображение, поэтому оно может работать на Raspberry Pi, и я использую docker 1.5.0, построенный для гиприота Raspberry Pi OS.

это копирование построенных слоев для каждой команды или почему каждая из последних нескольких команд занимает несколько минут?

2 ответов


каждая инструкция Dockerfile будет работать в контейнере. Это означает, что для каждой инструкции он будет выполнять следующее :

  • создайте экземпляр контейнера из изображения, созданного предыдущим шагом, который создаст новый слой (R/W)
  • сделайте вещь (pip install и т. д..)
  • Commit, который будет копировать верхний слой в качестве слоя изображения (я уверен, что он копирует слой)
  • и извлекать контейнер (если --rm опция указана) (таким образом, удаление слоя чтения/записи контейнера)

есть несколько операций ввода-вывода. На SSD это очень быстро, а также на хорошем жестком диске. Когда вы строите его на Raspberry PI, если вы строите его на SD-карте (или MicroSD), производительность SD-карты, вероятно, не так хороша. Это будет зависеть от класса MicroSD, и даже тогда я не думаю, что это действительно хорошо для карты. Я сделал попытку с простым проектом узла, и это определенно заняло несколько минут вместо нескольких секунд, как это было на моем ноутбуке. Это связано с оборудованием (в основном I / O для SD-карты, может быть, немного CPU, но...).

вы можете попробовать использовать внешний жесткий диск, подключенный к raspberry Pi, и переместить папки docker туда, чтобы увидеть, лучше ли производительность.


Это старый вопрос, но для справки, вы, возможно, страдали от выбранного драйвера хранения.

в Ubuntu / Debian Docker по умолчанию использует драйвер хранения AUFS, что довольно быстро. В других дистрибутивах Docker по умолчанию использует драйвер хранилища devicemapper, который очень медленный с конфигурацией по умолчанию (из-за режима "loop-lvm", настроенного по умолчанию и не рекомендуемого для использования в производстве).

проверьте это руководство для справки и посмотреть, как чтобы настроить драйвер хранения devicemapper в производстве (без режима цикла):https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/