Мой Dockerfile похож на
FROM my/base
ADD . /srv
RUN pip install -r requirements.txt
RUN python setup.py install
ENTRYPOINT ["run_server"]
Каждый раз, когда я создаю новый образ, необходимо переустанавливать зависимости, что может быть очень медленным в моем регионе.
Я думаю, что один из способов установки cache
пакетов - это переопределить my/base
образ более новыми изображениями, например:
docker build -t new_image_1 .
docker tag new_image_1 my/base
Поэтому в следующий раз, когда я буду использовать этот Dockerfile, в моем / base уже установлено несколько пакетов.
Но у этого решения есть две проблемы:
- Не всегда возможно переопределить базовое изображение
- Базовое изображение становится все больше и больше по мере наложения на него новых изображений.
Итак, какое лучшее решение я мог бы использовать для решения этой проблемы?
РЕДАКТИРОВАТЬ##:
Некоторая информация о докере на моей машине:
☁ test docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070
☁ test docker info
Containers: 0
Images: 56
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Dirs: 56
Execution Driver: native-0.2
Kernel Version: 3.13.0-29-generic
WARNING: No swap limit support
my/base
Ответы:
Попробуйте создать Dockerfile, который выглядит примерно так:
Docker будет использовать кеш во время установки pip до тех пор, пока вы не внесете никаких изменений в
requirements.txt
файл, независимо от того,.
были ли изменены другие файлы кода в . Вот вам пример.Вот простая
Hello, World!
программа:Результат сборки докера:
Изменим
run.py
:Попробуйте построить снова, результат ниже:
Как вы можете видеть выше, на этот раз докер использует кеш во время сборки. Теперь давайте обновим
requirements.txt
:Ниже приведен результат сборки докера:
Обратите внимание, как докер не использовал кеш во время установки pip. Если не работает, проверьте версию докера.
источник
ADD
инструкцию, кеш становится недействительным.ADD ./requirements.txt /srv/requirements.txt
), тогда докер должен использовать кеш. См. Добавление секции в документе Dockerfile.ADD requirements.txt /srv
перед запуском pip (RUN pip install -r requirements.txt
) и все остальные файлы после запуска pip. Таким образом, они должны быть в следующем порядке: (1)ADD requirements.txt /srv
; (2)RUN pip install -r requirements.txt
; ( 3)ADD . /srv
Чтобы минимизировать сетевую активность, вы можете указать
pip
каталог кеша на вашем хост-компьютере.Запустите свой док-контейнер с привязкой к каталогу pip-кеша вашего хоста, смонтированным в каталоге pip-кеша вашего контейнера.
docker run
команда должна выглядеть так:Затем в вашем Dockerfile установите свои требования как часть
ENTRYPOINT
оператора (илиCMD
оператора), а не какRUN
команду. Это важно, потому что (как указано в комментариях) монтирование недоступно во время построения образа (когдаRUN
выполняются операторы). Файл Docker должен выглядеть так:источник
Насколько я понимаю, на этот вопрос уже есть популярные ответы. Но есть более новый способ кэширования файлов для менеджеров пакетов. Я думаю, что это может быть хорошим ответом в будущем, когда BuildKit станет более стандартным.
Начиная с Docker 18.09 имеется экспериментальная поддержка BuildKit . BuildKit добавляет поддержку некоторых новых функций в Dockerfile, включая экспериментальную поддержку монтирования внешних томов по
RUN
шагам. Это позволяет нам создавать кеши для таких вещей, как$HOME/.cache/pip/
.В
requirements.txt
качестве примера мы будем использовать следующий файл:Типичный пример Python
Dockerfile
может выглядеть так:Если BuildKit включен с помощью
DOCKER_BUILDKIT
переменной окружения, мы можем построить некэшированныйpip
шаг примерно за 65 секунд:Теперь давайте добавим экспериментальный заголовок и изменим
RUN
шаг для кеширования пакетов Python:Давай, сделай еще одну сборку сейчас. На это должно уйти столько же времени. Но на этот раз он кэширует пакеты Python в нашем новом монтировании кеша:
Около 60 секунд. Подобно нашей первой сборке.
Внесите небольшие изменения в
requirements.txt
(например, добавив новую строку между двумя пакетами), чтобы принудительно сделать кеш недействительным и запустить снова:Всего около 16 секунд!
Мы получаем это ускорение, потому что мы больше не загружаем все пакеты Python. Они были кэшированы менеджером пакетов (
pip
в данном случае) и сохранены в монтированном томе кеша. Установка тома предоставляется на этапе запуска, чтобыpip
можно было повторно использовать наши уже загруженные пакеты. Это происходит вне кеширования уровня Docker .Прирост должен быть намного лучше на больших
requirements.txt
.Ноты:
Материал BuildKit не работает в Docker Compose или других инструментах, которые напрямую используют Docker API в данный момент.Теперь это поддерживается в Docker Compose с версии 1.25.0. См. Как включить BuildKit с помощью docker-compose?docker system prune -a
.Надеюсь, эти функции войдут в Docker для сборки, а BuildKit станет по умолчанию. Если / когда это произойдет, я постараюсь обновить этот ответ.
источник
Dockerfile
или версия Docker слишком старая. Я бы создал новый вопрос со всей вашей отладочной информацией.Я обнаружил, что лучше просто добавить каталог Python site-packages в качестве тома.
Таким образом, я могу просто установить новые библиотеки без необходимости полной перестройки.
РЕДАКТИРОВАТЬ : Не обращайте внимания на этот ответ, ответ jkukul выше работал у меня. Я намеревался кэшировать папку пакетов сайтов . Это выглядело бы примерно так:
Кеширование папки загрузки намного чище. Это также кеширует колеса, поэтому она правильно выполняет задачу.
источник