Когда вы запускаете (даже вне Docker)
export NODE_ENV=production
npm install
, он устанавливает dependencies
только с вашего package.json
, а не devDependencies
. С другой стороны, вам, вероятно, понадобится devDependencies
, чтобы получить такие инструменты, как typescript
.
. Хорошим решением здесь является использование многоэтапной сборки. На первом этапе устанавливаются все зависимостей; второй этап копирует только то, что необходимо для запуска приложения.
FROM gcr.io/companyX/companyX-node-base:12-alpine AS build
# Copy in only the parts needed to install dependencies
# (This avoids rebuilds if the package.json hasn’t changed)
COPY package.json package.lock .
# Install dependencies (including dev dependencies)
RUN npm install
# Copy in the rest of the project
# (include node_modules in a .dockerignore file)
COPY . .
# Build the project
RUN npm run build
# Second stage: runtime
FROM gcr.io/companyX/companyX-node-base:12-alpine
ENV NODE_ENV=production
# Again get dependencies, but this time only install
# runtime dependencies
COPY package.json package.lock .
RUN npm install
# Get the built application from the first stage
COPY --from=build /app/dist dist
# Set runtime metadata
EXPOSE 3000
CMD [ "npm", "start" ]
# CMD ["node", "dist/index.js"]
Обратите внимание, что этот подход не совместим с настройками, которые перезаписывают содержимое приложения произвольным содержимым с хоста или которые пытаются хранить библиотеки в Docker томах. Конечное изображение является автономным и не требует содержимого хоста, и может быть запущено как есть на других системах без отдельного копирования исходного кода.