У меня есть все эти материалы npm в моем Dockerfile, и создание моего образа Docker занимает много времени. Как я могу ускорить это и в идеале кэшировать результаты? Ничего не меняется, поэтому я не ожидал, что это займет так много времени (около 20 секунд).
FROM python:3.6-alpine
# python stuff
COPY requirements.txt /app/requirements.txt
RUN pip3 install --upgrade pip
RUN pip3 install -r /app/requirements.txt
# npm stuff
RUN apk add --update nodejs-npm
RUN npm init -y
RUN npm i webpack webpack-cli --save-dev
RUN npm i @babel/core babel-loader @babel/preset-env @babel/preset-react babel-plugin-transform-class-properties --save-dev
RUN npm i react react-dom prop-types --save
RUN npm i react-bootstrap bootstrap
RUN npm i weak-key --save
Я попробовал это решение с помощью COPY package.json, но babel и webpack, похоже, это не понравилось (и это не сработало).
ПРИМЕЧАНИЕ. Мне нужно использовать python:3.6-alpine, так как это существующее приложение Django, которое интегрирует React.js.
Вы пытались свести к минимуму использование RUN (каждый RUN создает новый временный контейнер, что делает его медленным)? Это вместо использования RUN для каждой команды, чтобы иметь несколько команд в одном и том же RUN - например, «RUN npm init -y & npm i webpack ... & ...". Вы по-прежнему можете разделить их на разные строки, используя «\» в конце каждой строки.
@shadowspawn - у меня есть COPY requirements.txt /app/requirements.txt над командами запуска. Почему это нарушает кеш докера?
Кэш слоя Docker: см. «Использование кеша сборки» на docs.docker.com/develop/develop-images/….
Кэш уровня докера должен ускорить сборку, если ничего не изменилось, на том же компьютере, за исключением начального сканирования каталога. Для этого см. "Понимание контекста сборки" на docs.docker.com/develop/develop-images/….
Если вы использовали package.json (и package-lock.json), а не устанавливали зависимости вручную, вы могли бы использовать «npm ci», а не «npm install»: docs.npmjs.com/cli/ci.html
Примечание. @Yagel предложил самый простой вариант победы, объединив команды RUN в один RUN. Я иду шире, задаваясь вопросом, что на самом деле медленно и что вы могли бы сделать по-другому. :-)
@Yagel - Это немного помогло, но я думаю, мне нужно выяснить, как это кэшировать (или не сломать кеш). Я рассмотрю ваши рекомендации Shadowspawn


Есть ли у вас какие-либо команды COPY или другие команды, которые разбивают кэш докеров над командами RUN, которые вы показываете?