Docker, лекция 4. Сборка приложения node.js

Docker, лекция 4. Сборка приложения node.js

В этой лекции продолжается изучение того, как создавать и развертывать приложения в виде контейнера Docker. Предыдущий сценарий охватывал развертывание статического HTML-сайта. В этой лекции рассматривается, как развернуть приложение Node.js в контейнере.

Среда настроена с доступом к личному экземпляру Docker, а код для приложения Expressjs по умолчанию находится в рабочем каталоге.

Имя компьютера, на котором запущен Docker, называется Docker. Если нужно получить доступ к какой-либо службе, следует использовать hostname docker вместо localhost или 0.0.0.0.

Базовый образ

Как описано в предыдущей лекции, все образы начинаются с базового изображения, в идеале максимально приближенного к желаемой конфигурации. Для Node.js есть готовые образы с тегами для каждой выпущенной версии.

Образ для node 10.0 это node:10-alpine. Это образ на основе alpine linux, который меньше и более обтекаема, чем официальное изображение.

Помимо базового образа также необходимо создать базовые каталоги, из которых запускается приложение. Используя RUN <command>, можно выполнять команды, как если бы они выполнялись из командной оболочки. Используя mkdir, можно создавать каталоги, из которых будет выполняться приложение. Сейчас идеальным каталогом был бы /src/app, поскольку пользователь среды имеет доступ для чтения/записи к этому каталогу.

Можно определить рабочий каталог, используя WORKDIR <каталог>, чтобы гарантировать, что все будущие команды будут выполняться из каталога нашего приложения.

В нашем Dockerfile определим выше описанное:

FROM node:10-alpine
RUN mkdir -p /src/app
WORKDIR /src/app

Работа с NPM

Базовый образ и местоположение приложения настроены. Следующим этапом является установка зависимостей, необходимых для запуска приложения. Для Node.js это означает запуск установки NPM.

Чтобы свести время сборки к минимуму, Docker кэширует результаты выполнения строки в файле Docker для использования в будущей сборке. Если что-то изменилось, то Docker сделает недействительными текущую и все последующие строки, чтобы убедиться, что все обновлено.

Сделаем так, чтобы npm install запускался только в том случае, если что-то в нашем файле package.json изменилось. Если ничего не изменилось, то продолжим использовать версию кеша для ускорения развертывания. Используя COPY package.json <dest>, можно сделать кеш команды RUN npm install недействительным, если файл package.json изменился. Если файл не изменился, то кэш не будет признан действительным, и будут использованы кэшированные результаты команды установки npm.

Добавим описанные выше действия в dockerfile:

COPY package.json /src/app/package.json
RUN npm install

Пример package.json:

{
"name": "scrapbook-node-docker-client-as-container",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"express": "~4.9.0",
"body-parser": "~1.8.1",
"cookie-parser": "~1.3.3",
"morgan": "~1.3.0",
"serve-favicon": "~2.1.3",
"debug": "~2.0.0",
"jade": "~1.6.0"
}
}

Это перевод-заметка для себя с сайта katacoda.com. Полные копии приложения есть там с возможностью запуска описанных тут команд.

Время развертывания

Создадим необходимые шаги в Dockerfile, чтобы завершить развертывание приложения, как это было на прошлой лекции.

Скопируем файлы для развертывания, в Dockerfile следует использовать COPY. <dest dir>.

После того, как исходный код скопирован, порты, к которым требуется доступ к приложению, определяются с помощью EXPOSE <порт>.

Наконец, приложение готово к установке зависимостей. При использовании Node.js следует использовать один хитрый прием: запустить команду npm. Параметр start описан в «scripts» — «start» файла package.json. Ниже приведен пример и краткое описание — почему так.

COPY . /src/app
EXPOSE 3000
CMD [ "npm", "start" ]

После того, как мы установили наши зависимости с помощью npm install, мы хотим скопировать остальную часть исходного кода нашего приложения. Разделение установки зависимостей и копирование исходного кода позволяет нам использовать кеш при необходимости.

Если мы скопируем наш код перед запуском npm install, он будет запускаться каждый раз, так как наш код изменился бы. Копируя просто package.json, мы можем быть уверены, что кеш становится недействительным только тогда, когда содержимое нашего пакета изменилось. Итоговый dockerfile:

FROM node:10-alpine
RUN mkdir -p /src/app
WORKDIR /src/app
COPY package.json /src/app/package.json
RUN npm install
COPY . /src/app
EXPOSE 3000
CMD [ "npm", "start" ]

Запускаем

docker build -t my-nodejs-app .
docker run -d --name my-running-app -p 3000:3000 my-nodejs-app

И проверяем:

curl http://docker:3000

Переменные окружения

Образы docker должны быть спроектированы так, чтобы их можно было переносить из одной среды в другую без внесения каких-либо изменений или необходимости восстановления. Следуя этому шаблону, вы можете быть уверены, что если он работает в одной среде, например, в промежуточной, то он будет работать в другой среде, например в рабочей среде.

С помощью Docker переменные среды могут быть определены при запуске контейнера. Например, для приложений Node.js вы должны определить переменную среды для NODE_ENV при запуске.

Используя опцию -e, вы можете установить имя и значение -e NODE_ENV = production

docker run -d --name my-production-running-app -e NODE_ENV=production -p 3000:3000 my-nodejs-app

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *