Есть ли способ установить пакеты в движке приложения один раз, чтобы избежать длительного развертывания каждый раз? - PullRequest
0 голосов
/ 25 января 2019

Мне нужно иметь ghostscript и ImageMagick для редактирования PDF и распознавания текста. Я дошел до того, что использую Dockerfile, но кажется, что gcloud app deploy будет начинаться с самого начала каждый раз. Есть ли способ ускорить его, установив пакеты один раз?

Вот мой Dockerfile:

ROM gcr.io/google-appengine/python
LABEL python_version=python3.6
RUN virtualenv --no-download /env -p python3.6

# Set virtualenv environment variables. This is equivalent to running
# source /env/bin/activate

ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ADD requirements.txt /app/
RUN pip install -r requirements.txt
ADD . /app/

RUN apt-get update
RUN apt-get install imagemagick -y
RUN apt-get install ghostscript

CMD exec gunicorn -b :$PORT main:app

1 Ответ

0 голосов
/ 25 января 2019

Переместите эти шаги ранее в Dockerfile.

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

По стилю я бы изменил две другие вещи.Во-первых, по аналогичным причинам кэширования важно запускать apt-get update и apt-get install на одном шаге RUN, поскольку ранее кэшированные URL-адреса из «update» могут стать недействительными.Во-вторых, я не стал бы пытаться настроить виртуальную среду Python, так как образ Docker уже предоставляет изолированную файловую систему и установку Python.

Это в конечном итоге оставляет вам:

FROM gcr.io/google-appengine/python
LABEL python_version=python3.6
RUN apt-get update \
 && apt-get install -y ghostscript imagemagick
COPY requirements.txt /app/
RUN pip install -r requirements.txt
COPY . /app/
EXPOSE 8000
CMD ["gunicorn", "-b", ":8000", "main:app"]
...