- Оригинальный адрес:An Exhaustive Guide to Writing Dockerfiles for Node.js Web Apps
- Оригинальный автор:Praveen Durairaj
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:lsvih
- Корректор:Raoul1996, song-han
Руководство по Dockerfile для приложений Node.js
TL;DR
В этой статье рассматриваются примеры создания веб-приложений Node.js в несколько этапов, от создания простого файла Dockerfile до производства. Ниже приводится краткое изложение содержания этого руководства:
- Используйте подходящее базовое изображение (углеродное для разработки, альпийское для производства).
- использовать во время разработки
nodemon
Делайте горячую перезагрузку. - Оптимизация уровня кеша Docker — используйте команды в правильном порядке, запускайте только при необходимости
npm install
. - использовать
serve
Пакеты развертывают статические файлы (например, пакеты, созданные React, Vue, Angular). - использовать
alpine
Выполняйте многоэтапные сборки в производственной среде, чтобы уменьшить размер конечного файла образа. - #Предложить — 1) Использовать КОПИРОВАТЬ вместо ДОБАВИТЬ 2) Использовать
init
Флаги, обрабатывает сигналы ядра, такие как CTRL-C.
Если вам нужен код для вышеуказанных шагов, см.GitHub repo.
содержание
- Простой пример Dockerfile и файл .dockerignore
- Горячее обновление с помощью Nodemon
- оптимизация
- Развертывание статических файлов
- Прямая сборка в производстве
- Многоэтапные сборки в производстве
Давайте сначала предположим, что приложение называется 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 для создания окончательногоbundle
package, здесь мы используем 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,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.