Для уменьшения docker размера изображения вы можете использовать
- Многоступенчатая сборка
- Npm Обрезать
При использовании многоступенчатой build У вас должно быть 2 (или более) директивы FROM, как обычно, первый этап выполняет сборку, а второй этап просто копирует сборку из первого временного слоя и содержит инструкции для запуска приложения. В нашем случае мы должны скопировать каталоги dist & node_modules.
Второй важный момент - это правильное разделение зависимостей между 'devDependencies' & 'dependencies' в вашем пакете. json файл.
После того, как вы установили deps на первом этапе, вы должны использовать npm prune --production для удаления devDependencies из узловых модулей.
FROM node:12.14.1-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . ./
RUN npm run build && npm prune --production
FROM node:12.14.1-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app/dist /app/dist
COPY --from=build /app/node_modules /app/node_modules
EXPOSE 3000
ENTRYPOINT [ "node" ]
CMD [ "dist/main.js" ]
Если у вас проблемы с node-gyp или просто хочу увидеть - полный пример с комментариями в этой сущности:
https://gist.github.com/nzvtrk/cba2970b1df9091b520811e521d9bd44
Более полезные ссылки:
https://docs.docker.com/develop/develop-images/multistage-build/
https://docs.npmjs.com/cli/prune