Как мне кэшировать сборку пакета Python для Docker для Alpine Linux? - PullRequest
0 голосов
/ 30 мая 2018

В связи с этим возникает вопрос: «Почему сборка Pandas идет медленно в Alpine Linux?»:

Почему для установки Pandas в Alpine Linux требуются годы

Я хотел бы знать, как обойти это (ответы не говорят), то есть как кэшировать сборку Alpine, чтобы утилизировать произвольный скомпилированный модуль python для использования в другой сборке Docker.

Такой готовый модуль может быть размещен в закрытом репо.Как Dockerfile может извлечь это?

Я особенно заинтересован в решении для pandas, но было бы прекрасно разыграть сеть шире.

Спасибо за помощь.

1 Ответ

0 голосов
/ 06 июня 2018

Разделяйте команды, используя разные «шаги RUN», каждый шаг будет пытаться использовать кэш предыдущего шага, как только одна строка изменяется, цепочка кеша становится недействительной, и все последующие строки выполняются, поэтому вы хотите сохранитьмедленно меняющиеся элементы сверху и часто меняющиеся снизу.

Например, содержимое вашего Dockerfile может иметь:

FROM python:2.7-alpine

RUN apk add --update bash curl
RUN apk add gcc make linux-headers musl-dev openldap-dev libxml2-dev libxslt-dev libffi-dev pcre-dev
RUN apk add cython
RUN pip install pandas
#RUN install your package/library

В приведенном выше примере вы увидитевыходные строки, подобные приведенным ниже (обратите внимание на те, которые говорят «Использование кэша»):

Sending build context to Docker daemon  56.83kB
Step 1/11 : FROM python:2.7-alpine
 ---> b630f364abf4
Step 2/11 : RUN apk add --update bash curl
 ---> Using cache
 ---> a611e4bbdbae
Step 3/11 : RUN apk add gcc make linux-headers musl-dev openldap-dev libxml2-dev libxslt-dev libffi-dev pcre-dev
 ---> Using cache
 ---> 87e91533771d
Step 4/11 : RUN apk add cython
 ---> Using cache
 ---> 47e0fd345aa8
Step 5/11 : RUN pip install pandas
 ---> Running in c57947f606e5

Каждая строка вывода «Использование кэша» указывает, что строка выше непосредственно не была выполнена, но результаты взяты из кэшированногоlayer.

В первый раз все будет выполнено, но это будет намного быстрее при следующих выполнениях (при условии, что все остальное остается неизменным на хосте).

Теперь вы можете "docker push: "в свой частный (или даже публичный) реестр и запускать другие сборки с помощью Dockerfile, который начинается с:

FROM <BASE IMAGE with pandas>:<TAG>

Above называется парадигмой «родительские / базовые изображения» и «строитель», вы можете прочитать больше на https://docs.docker.com/develop/develop-images/baseimages/

И в последнее время вы также можете иметь «многоэтапные сборки», которые по сути одинаковы, но упрощенный, так что вы можете использовать один Dockerfile: https://docs.docker.com/develop/develop-images/multistage-build/

...