Dockerfile, как уменьшить размер измененного слоя?

#python #docker #dockerfile

#python #docker #dockerfile

Вопрос:

У меня есть проект, в котором есть несколько больших файлов и папок. некоторые файлы в основном статичны (*.params). Теперь я надеюсь опубликовать статические файлы / папки как независимый слой. Ниже приведена структура моего проекта.

 /app
  /static_files
     /a.params
     /b.params
     /dynamic1.py
     /dynamic2.py
  /static_folders
     /dynamic1.py
     /dynamic2.py
     /dynamic3.py
     /folder1
  /dynamic1
     /dynamic.py
  /dynamic2
     /dynamic.py
  run.py
  requirements.txt
  

и Dockerfile является

 FROM nvidia/cuda:10.1-devel as base
WORKDIR /app

RUN apt update amp;amp; apt install python3-pip -y amp;amp; rm -rf /var/lib/apt/lists/*
RUN pip3 install --upgrade pip

COPY requirements.txt .
RUN pip3 install -r requirements.txt

COPY . .
RUN make
CMD ["python3","run.py"]
  

на самом деле, я изменил некоторый код в run.py после публикации пользователь должен извлечь изображение размером более 300 МБ.

Заранее спасибо.

Ответ №1:

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

Для достижения этого вы должны разделить свой слой так, чтобы статический (и предположительно большой) файл находился на отдельном слое по отношению к динамическим (предположительно небольшим) файлам.

Вы могли бы добиться этого, создав выделенную static папку и выпустив 2 отдельных COPY файла: один для статического каталога и один для всего остального (заботясь об исключении самого статического каталога!).

Учитывая, что ваша текущая структура объединяет статические и динамические ресурсы, это немного более громоздко, поскольку вы не можете просто COPY использовать всю папку и покончить с этим. В вашем случае команда должна быть чем-то вроде:

 # Preparing layers for static resources
COPY static_files/*.param static_files/
COPY static_folders/folder* static_folders/

# Copying the rest of the resources
COPY static_files/*.py static_files/
COPY static_folders/*.py static_folders/
COPY dynamic* run.py requirements.txt .
  

Однако это довольно неуклюже и подвержено ошибкам (вы можете легко забыть настроить Dockerfile при добавлении нового статического ресурса с новым шаблоном имен), а также приведет к куче слоев вместо всего 2 отдельных статических и динамических слоев. Поэтому, вероятно, стоило бы оценить, может ли изменение структуры проекта быть выгодным вложением в долгосрочной перспективе.

Комментарии:

1. спасибо, я изменю структуру своего проекта, чтобы соответствовать этому.