Использование каталога pip-кэша в сборках Docker - PullRequest
1 голос
/ 19 сентября 2019

Я надеюсь получить мои pip install инструкции внутри моих docker build с как можно быстрее.

Я прочитал много сообщений , объясняющихКак добавление вашего requirements.txt перед остальной частью приложения поможет вам использовать собственный кэш изображений Docker, если ваш requirements.txt не изменился.Но это совсем не помогает, когда зависимости меняются, даже незначительно.

Следующим шагом будет, если мы сможем использовать согласованный каталог кеша пипсов.По умолчанию pip будет кэшировать загруженные пакеты в ~/.cache/pip (в Linux), и поэтому, если вы когда-либо устанавливаете ту же версию модуля, которая была установлена ​​ранее где-либо в системе, она не должна идтии загрузите его снова, но вместо этого просто используйте кэшированную версию.Если бы мы могли использовать каталог общего кэша для сборок Docker, это могло бы значительно ускорить установку зависимостей.

Однако, похоже, не существует простого способа монтировать том во время выполнения docker build.Среда сборки кажется в основном непроницаемой.Я обнаружил одну статью , предлагающую гениальный, но сложный метод запуска сервера rsync на хосте, а затем, взломав сборку для получения IP-адреса хоста, rsyncing кэш пипса с хоста.Но я не наслаждаюсь идеей запуска rsync-сервера в Jenkins (которая не является самой безопасной платформой в лучшие времена).

Кто-нибудь знает, есть ли какой-нибудь другой способ достижения общего кэша?громкость проще?

1 Ответ

1 голос
/ 20 сентября 2019

Я предлагаю вам использовать buildkit , также смотрите this .

Dockerfile:

# syntax = docker/dockerfile:experimental
FROM python:3.6-alpine
RUN --mount=type=cache,target=/root/.cache/pip pip install pyyaml

ПРИМЕЧАНИЕ : # syntax = docker/dockerfile:experimental является обязательным. Вы должны добавить его в начале Dockerfile, чтобы включить эту функцию.

1.

Первый запуск сборки:

export DOCKER_BUILDKIT=1
docker build --progress=plain -t abc:1 . --no-cache

Первый журнал:

#9 [stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install...
#9   digest: sha256:55b70da1cbbe4d424f8c50c0678a01e855510bbda9d26f1ac5b983808f3bf4a5
#9 name: "[stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install pyyaml"
#9  started: 2019-09-20 03:11:35.296107357 +0000 UTC
#9 1.955 Collecting pyyaml
#9 3.050   Downloading https://files.pythonhosted.org/packages/e3/e8/b3212641ee2718d556df0f23f78de8303f068fe29cdaa7a91018849582fe/PyYAML-5.1.2.tar.gz (265kB)
#9 5.006 Building wheels for collected packages: pyyaml
#9 5.007   Building wheel for pyyaml (setup.py): started
#9 5.249   Building wheel for pyyaml (setup.py): finished with status 'done'
#9 5.250   Created wheel for pyyaml: filename=PyYAML-5.1.2-cp36-cp36m-linux_x86_64.whl size=44104 sha256=867daf35eab43c2d047ad737ea1e9eaeb4168b87501cd4d62c533f671208acaa
#9 5.250   Stored in directory: /root/.cache/pip/wheels/d9/45/dd/65f0b38450c47cf7e5312883deb97d065e030c5cca0a365030
#9 5.267 Successfully built pyyaml
#9 5.274 Installing collected packages: pyyaml
#9 5.309 Successfully installed pyyaml-5.1.2
#9completed: 2019-09-20 03:11:42.221146294 +0000 UTC
#9 duration: 6.925038937s

Сверху вы можете увидеть первый раз сборкузагрузит pyyaml ​​из Интернета.

2.

Вторая сборка выполнения:

docker build --progress=plain -t abc:1 . --no-cache

второй журнал:

#9 [stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install...
#9   digest: sha256:55b70da1cbbe4d424f8c50c0678a01e855510bbda9d26f1ac5b983808f3bf4a5
#9 name: "[stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install pyyaml"
#9  started: 2019-09-20 03:16:58.588157354 +0000 UTC
#9 1.786 Collecting pyyaml
#9 2.234 Installing collected packages: pyyaml
#9 2.270 Successfully installed pyyaml-5.1.2
#9completed: 2019-09-20 03:17:01.933398002 +0000 UTC
#9 duration: 3.345240648s

Сверху видно, что сборка больше не скачивает пакет из интернета, просто используйте кеш.ПРИМЕЧАНИЕ: это не традиционный кэш сборки Docker, поскольку я использую --no-cache, это /root/.cache/pip, который я монтирую в сборку.

3.

Третье выполнение сборки, которое удаляет кеш buildkit:

docker builder prune
docker build --progress=plain -t abc:1 . --no-cache

Третий журнал:

#9 [stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install...
#9   digest: sha256:55b70da1cbbe4d424f8c50c0678a01e855510bbda9d26f1ac5b983808f3bf4a5
#9 name: "[stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install pyyaml"
#9  started: 2019-09-20 03:19:07.434792944 +0000 UTC
#9 1.894 Collecting pyyaml
#9 2.740   Downloading https://files.pythonhosted.org/packages/e3/e8/b3212641ee2718d556df0f23f78de8303f068fe29cdaa7a91018849582fe/PyYAML-5.1.2.tar.gz (265kB)
#9 3.319 Building wheels for collected packages: pyyaml
#9 3.319   Building wheel for pyyaml (setup.py): started
#9 3.560   Building wheel for pyyaml (setup.py): finished with status 'done'
#9 3.560   Created wheel for pyyaml: filename=PyYAML-5.1.2-cp36-cp36m-linux_x86_64.whl size=44104 sha256=cea5bc4689e231df7915c2fc3abca225d4ee2e869a7540682aacb6d42eb17053
#9 3.560   Stored in directory: /root/.cache/pip/wheels/d9/45/dd/65f0b38450c47cf7e5312883deb97d065e030c5cca0a365030
#9 3.580 Successfully built pyyaml
#9 3.585 Installing collected packages: pyyaml
#9 3.622 Successfully installed pyyaml-5.1.2
#9completed: 2019-09-20 03:19:12.530742712 +0000 UTC
#9 duration: 5.095949768s

Сверху вы можете увидеть, удаляете ли buildkitcache, пакет снова скачивается.

Одним словом, он даст вам общий кеш между несколькими сборками, и этот кеш будет монтироваться только при сборке образа.Но само изображение не будет иметь этого кэша, поэтому избегайте большого количества промежуточных слоев в изображении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...