Руководство по Dockerfile для приложений Node.js

Node.js задняя часть Docker Программа перевода самородков
Руководство по Dockerfile для приложений Node.js

Руководство по Dockerfile для приложений Node.js

TL;DR

В этой статье рассматриваются примеры создания веб-приложений Node.js в несколько этапов, от создания простого файла Dockerfile до производства. Ниже приводится краткое изложение содержания этого руководства:

  • Используйте подходящее базовое изображение (углеродное для разработки, альпийское для производства).
  • использовать во время разработкиnodemonДелайте горячую перезагрузку.
  • Оптимизация уровня кеша Docker — используйте команды в правильном порядке, запускайте только при необходимостиnpm install.
  • использоватьserveПакеты развертывают статические файлы (например, пакеты, созданные React, Vue, Angular).
  • использоватьalpineВыполняйте многоэтапные сборки в производственной среде, чтобы уменьшить размер конечного файла образа.
  • #Предложить  —  1) Использовать КОПИРОВАТЬ вместо ДОБАВИТЬ 2) ИспользоватьinitФлаги, обрабатывает сигналы ядра, такие как CTRL-C.

Если вам нужен код для вышеуказанных шагов, см.GitHub repo.

содержание

  1. Простой пример Dockerfile и файл .dockerignore
  2. Горячее обновление с помощью Nodemon
  3. оптимизация
  4. Развертывание статических файлов
  5. Прямая сборка в производстве
  6. Многоэтапные сборки в производстве

Давайте сначала предположим, что приложение называется node-app с простой структурой каталогов. в каталоге верхнего уровня, содержащемDockerfileа такжеpackage.json, код приложения узла будет храниться вsrcПод содержанием. Для краткости предположим, что server.js определяет экспресс-службу узла, работающую на порту 8080.

node-app
├── Dockerfile
├── package.json
└── src
    └── server.js

1. Простой пример Dockerfile

FROM node:carbon

# 创建 app 目录
WORKDIR /app

# 安装 app 依赖
# 使用通配符确保 package.json 与 package-lock.json 复制到需要的地方。(npm 版本 5 以上) COPY package*.json ./

RUN npm install
# 如果你需要构建生产环境下的代码,请使用:
# RUN npm install --only=production

# 打包 app 源码
COPY src /app

EXPOSE 8080
CMD [ "node", "server.js" ]

Мы будем использовать последнюю версию LTSnode:carbonв качестве базового изображения.

При создании образа docker извлекает все файлы, расположенные по адресуcontextфайлы в каталоге. Чтобы увеличить скорость сборки докеров, вы можете добавить в каталог контекста.dockerignoreфайл, чтобы исключить нежелательные файлы и каталоги.

Обычно ваш.dockerignoreФайл должен выглядеть так:

.git
node_modules
npm-debug

Соберите и запустите этот образ:

$ cd node-docker
$ docker build -t node-docker-dev .
$ docker run --rm -it -p 8080:8080 node-docker-dev

Вы сможете[http://localhost:8080](http://localhost:8080.)Посетите это приложение. использоватьCtrl+CКомбинация клавиш для выхода из программы.

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

$ docker run --rm -it -p 8080:8080 -v $(pwd):/app \
             node-docker-dev bash
root@id:/app# node src/server.js

2. Используйте Nodemon для реализации горячего обновления

nodemon— это популярный пакет, который отслеживает файлы в каталоге во время выполнения, и при изменении любого файла nodemon автоматически перезапускает ваше приложение node.

FROM node:carbon

# 创建 app 目录
WORKDIR /app

# 安装 nodemon 以实现热更新
RUN npm install -g nodemon

# 安装 app 依赖
# 使用通配符确保 package.json 与 package-lock.json 复制到需要的地方。(npm 版本 5 以上)COPY package*.json ./

RUN npm install

# 打包 app 源码
COPY src /app

EXPOSE 8080
CMD [ "nodemon", "server.js" ]

Мы создадим образ и запустим nodemon дляappПересоберите код при изменении файлов в каталоге.

$ cd node-docker
$ docker build -t node-hot-reload-docker .
$ docker run --rm -it -p 8080:8080 -v $(pwd):/app \
             node-hot-reload-docker bash
root@id:/app# nodemon src/server.js

всеappИзменения в каталоге вызовут перестроение, и эти изменения можно найти в[http://localhost:8080](http://localhost:8080.)Показать в реальном времени. Обратите внимание, что мы смонтировали файл в контейнер, чтобы nodemon работал.

3. Оптимизация

в вашем Dockerfile, если вам не нужно автоматически извлекать tar-файл (см.Лучшие практики Docker), в противном случае лучше использовать COPY вместо ADD.

обходитьpackage.jsonизstartкоманду, но напрямую «записывает» приложение в файл образа. Итак, в Dockerfile CMD не используйте:

$ CMD ["npm","start"]

Вместо этого используйте:

$ CMD ["node","server.js"]

вместо. Это уменьшает количество процессов, запущенных в контейнере, и в то же время позволяет процессу Node.js получатьSIGTERMиSIGINTДождитесь сигнала выхода, если это процесс npm, эти сигналы будут проигнорированы (см.Node.js: лучшие практики Docker).

вы также можете использовать--initзнак, сtiniЛегкие системы инициализации для переноса ваших процессов Node.js, они также могут реагировать на некоторыеSIGTERM(CTRL-C) и другие сигналы ядра. Например, вы можете использовать:

$ docker run --rm -it --init -p 8080:8080 -v $(pwd):/app \
             node-docker-dev bash

4. Разверните статические файлы

В предыдущем Dockerfile предполагается, что вы используете службу API, созданную с помощью Node.js. Итак, вот что нужно сделать, если вы хотите развернуть приложения React.js, Vue.js, Angular.js с помощью Node.js.

FROM node:carbon

# 创建 app 目录
WORKDIR /app

# 安装 app 依赖
RUN npm -g install serve
# 使用通配符复制 package.json 与 package-lock.json
COPY package*.json ./

RUN npm install

# 打包 app 源码
COPY src /app
# 将 react、vue、angular 打包构建成静态文件
RUN npm run build

EXPOSE 8080
# 将 dist 目录部署于 8080 端口
CMD ["serve", "-s", "dist", "-p", "8080"]

Как видите, когда вам нужно создавать UI-приложения, созданные с помощью React, Vue или Angular, используйтеnpm run buildдля сжатия файлов JS и CSS для создания окончательногоbundlepackage, здесь мы используем npm[serve](https://www.npmjs.com/package/serve)package для развертывания статических файлов.

Кроме того, можно использовать некоторые альтернативы: 1) Соберите файлы пакета локально, затем используйте докер nginx для развертывания этих статических файлов. 2) Сборка с использованием рабочего процесса CI/CD.

5. Прямая сборка в производстве

FROM node:carbon

# 创建 app 目录
WORKDIR /app

# 安装 app 依赖
# RUN npm -g install serve

# 使用通配符复制 package.json 与 package-lock.json
COPY package*.json ./

RUN npm install

# 打包 app 源码
COPY src /app

# 如需对 react/vue/angular 打包,生成静态文件,使用:
# RUN npm run build

EXPOSE 8080
# 如需部署静态文件,使用:
#CMD ["serve", "-s", "dist", "-p", "8080"]
CMD [ "node", "server.js" ]

Создайте и запустите этот универсальный образ:

$ cd node-docker
$ docker build -t node-docker-prod .
$ docker run --rm -it -p 8080:8080 node-docker-prod

Поскольку нижний слой — Debian, образ после сборки занимает около 700 МБ (точное значение зависит от вашего исходного кода). Давайте обсудим, как уменьшить размер этого файла.

6. Многоступенчатая сборка в производстве

При использовании многоуровневой сборки будет использоваться несколько файлов Dockerfile.FROMоператор, но в конечном итоге будут использоваться только файлы, созданные на последнем этапе. Таким образом, полученный образ будет содержать только те зависимости, которые необходимы рабочему серверу, и в идеале файлы будут очень маленькими.

# ---- Base Node ----
FROM node:carbon AS base
# 创建 app 目录
WORKDIR /app

# ---- Dependencies ----
FROM base AS dependencies  
# 使用通配符复制 package.json 与 package-lock.json
COPY package*.json ./
# 安装在‘devDependencies’中包含的依赖
RUN npm install

# ---- Copy Files/Build ----
FROM dependencies AS build  
WORKDIR /app
COPY src /app
# 如需对 react/vue/angular 打包,生成静态文件,使用:
# RUN npm run build

# --- Release with Alpine ----
FROM node:8.9-alpine AS release  
# 创建 app 目录
WORKDIR /app
# 可选命令:
# RUN npm -g install serve
COPY --from=dependencies /app/package.json ./
# 安装 app 依赖
RUN npm install --only=production
COPY --from=build /app ./
#CMD ["serve", "-s", "dist", "-p", "8080"]
CMD ["node", "server.js"]

Используя описанный выше метод, размер файла изображения, созданного с помощью Alpine, составляет около 70 МБ, что в 10 раз меньше, чем раньше. использоватьalpineВерсии для сборки могут эффективно уменьшить размер образа.

Если у вас есть какие-либо предложения по предыдущему подходу или вы хотели бы увидеть другие варианты использования, сообщите об этом автору.

ПрисоединяйсяReddit / HackerNewsобсуждать:)


Кроме того, пробовали ли вы развернуть свое веб-приложение Node.js на Hasura? На самом деле это самый быстрый способ развернуть приложение Node.js в домене HTTPS (просто используйте git push). попробуй использоватьА, Hasselblad.io/hub/node будет-…шаблон, чтобы начать быстро! Все шаблоны проектов в Hasura поставляются со стандартными файлами Dockerfiles и Kubernetes, которые вы можете определять свободно.

благодарныйTanmai Gopal


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из ИнтернетаНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.