Создание совершенно нового приложение NestJS очень просто благодаря потрясающему CLI (интерфейсу командной строки). С помощью одной команды nest new app-name, мы получаем полностью функциональное, готовое к работе приложение.
Сгенерированная установка прекрасно подходит для простого приложения, но по мере того, как это становится более сложным и начинает зависеть от внешних сервисов, таких как Postgres или Radis
Создание нового проекта
Мы можем легко создать новое приложение NestJS с помощью предназначенного для это CLI.
Чтобы установить CLI глобально, выполните:
1
yarn global add @nestjs/cli
Теперь для того, чтобы создать приложение, мы вполним:
1
nest n app-name
Естественно, app-name заменяется на актуальное название приложения. Имейте в виду, что приложение будет создано в папке app-name в текущем каталоге.
Мастер CLI попросит нас выбрать между npm и yarn; в этом руководстве мы будем использовать yarn.
Картинка
Теперь, когда наше приложение настроено, давайте перейдем к добавлению Docker.
Добавление Docker c помощью многостэтапной сборки
Контейнеризация наших приложений с помощью Docker имеет много преимуществ. Для нас два наиболее важных - это то, что приложение будет вести себя так, как ожидалось, независимо от среды, и что можно установить все внешние зависимости (в нашем случае Redis и PostgreSQL) автоматически при запуске приложения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
FROM node:12.13-alpine As development
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=development
COPY . .
RUN npm run build
FROM node:12.13-alpine as production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . .
COPY --from=development /usr/src/app/dist ./dist
CMD ["node", "dist/main"]
И давайте пройдемся по нему построчно:
1
FROM node:12.13-alpine As development
Во-первых, мы указываем Docker использовать официальный образ Node.js, доступный в публичном репозитории.
Указываем версию Node 12.13 и выбираем образ Alpine. Образа Alpine легче, но их использование может привести к неожиданному поведению.
Поскольку мы используем функцию многоэтапной сборки, мы также используем оператор AS для именования образа development. Имя здесь может быть любым; это только ссылка на образ позже.
1
WORKDIR /usr/src/app
После установки WORKDIR, каждая команда выполняемая Docker (определенная в операторе RUN), будет выполняться в указанном контексте.
1 2 3
COPY package*.json ./
RUN npm install --only=development
COPY . .
Сначала копируем только package.json и package-lock.json (если он существует). Затем мы запускаем в контексте WORKDIR команду npm install. Как только он завершится, мы скопируем остальные файлы нашего приложения в контейнер Docker.
Здесь мы устанавливаем только devDependencies из-за того, что контейнер используется в качестве «сборщика», который использует все необходимые инструменты для сборки приложения, а затем отправляет чистую папку /dist в production образ.
Порядок операторов здесь очень важен из-за того, как Docker кэширует слои. Каждый оператор в Dockerfile создает новый слой образа, который кэшируется.