Как ускорить копирование с одного изображения на другое в dockerfile

Я создаю образ своего приложения, который включает упаковку различных приложений.

После выполнения тестов / npm / bower install и т. д. Я пытаюсь скопировать содержимое из предыдущего изображения в новое изображение. Но эта КОПИЯ кажется очень медленной и занимает более 3-4 минут.

COPY --from=0 /data /data

(Размер папки / data составляет около 800 МБ и тысячи файлов)

Может ли кто-нибудь предложить лучшую альтернативу или идею по оптимизации:

Вот мой файл докеров:

FROM node:10-alpine
RUN apk add python git \
  && npm install -g bower

ENV CLIENT_DIR /data/current/client
ENV SERVER_DIR /data/current/server
ENV EXTRA_DIR /data/current/extra

ADD src/client $CLIENT_DIR
ADD src/server $SERVER_DIR

WORKDIR $SERVER_DIR
RUN npm install
RUN npm install --only=dev
RUN npm run build

WORKDIR $CLIENT_DIR
RUN bower --allow-root install

FROM node:10-alpine 
COPY --from=0 /data /data # This step is very very slow.
EXPOSE 80
WORKDIR /data/current/server/src
CMD ["npm","run","start:staging"]

Или, если кто-нибудь может помочь мне очистить первую фазу (чтобы уменьшить размер изображения), чтобы не потребовалось использовать следующее изображение, которое тоже будет полезно.

Сделайте шаги построения на своем первом изображении и постарайтесь скопировать только то, что строго необходимо. Например, вряд ли вам понадобится все дерево node_modules. Но 3-4 минуты в любом случае кажутся слишком длинными. Насколько велик этот каталог?

Henry 31.10.2018 13:22

Я создаю изображение в первом изображении и копирую во втором. Размер папки / data составляет 811,7 МБ.

undefined 31.10.2018 13:41

В настоящее время вы ничего не строите на первом изображении. Вы просто устанавливаете что-то. Затем вы копируете почти все на второй образ (за исключением python, git и bower).

Henry 31.10.2018 13:53
6
3
3 637
1

Ответы 1

Это требует времени, потому что файлов очень много. Если вы можете сжать папку данных как tar, а затем скопировать и извлечь, будет полезно в вашей ситуации.

Иначе Если вы можете сделать этот шаг для запуска контейнеров, он будет очень быстрым. В соответствии с вашим требованием вам необходимо скопировать изображение вашего приложения, которое уже создано в другом изображении. Вы можете использовать функцию совместного использования тома, которая будет разделять том между 2 или более контейнерами докеров.

Создайте 1-й контейнер:

docker run -ti --name=Container -v datavolume:/datavolume ubuntu

2-й контейнер:

docker run -ti --name=Container2 --volumes-from Container ubuntu

Или вы можете использовать параметр -v, поэтому с параметром v создайте контейнер 1-й и 2-й как:

docker run -v docker-volume:/data-volume --name centos-latest -it centos

docker run -v docker-volume:/data-volume --name centos-latest1 -it centos

Это создаст и будет использовать одну и ту же папку тома, которая является томом данных в обоих контейнерах. докер-том - это имя тома, а объем данных - имя папки в этом контейнере, которая будет указывать на том докер-том. Таким же образом вы можете совместно использовать том с более чем двумя контейнерами.

Он создает образ, а не среду выполнения. Требуется время сборки

Dockstar 31.10.2018 16:19

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

David Maze 31.10.2018 16:29

Другие вопросы по теме