Saltearse al contenido

Docker

Esta guía asume que tiene nociones en los siguientes temas:

¿Por qué Docker?

Docker proporciona un entorno consistente que garantiza el correcto funcionamiento de cualquier bot tanto en desarrollo como en producción, además de simplificar el flujo de trabajo mediante la integración con herramientas de CI/CD.

Con Docker escalar un bot horizontalmente es sencillo, permitiendo distribuir la carga de trabajo entre múltiples instancias en caso de ser necesario.

¿Qué archivos necesita un proyecto de Seyfert?

  • package.json
  • seyfert.config.mjs
  • /node_modules
  • /src o /dist

Desplegando con Node.js

Imagen para un proyecto TypeScript

Una imagen sencilla para desplegar un bot sería la siguiente:

Dockerfile
FROM node:<VERSION_TAG>
WORKDIR /bot
COPY package*.json ./
RUN npm install --production
RUN npm i -g typescript
COPY tsconfig.json seyfert.config.mjs ./
COPY /src ./src
# Build typescript files
RUN tsc --project tsconfig.json
ENV NODE_ENV=production
ENTRYPOINT ["node", "dist/index.js"]

Debe reemplazar <VERSION_TAG> por la versión de Node.js que quiera utilizar.

Imagen con multi-stage builds

Pese a que la anterior imagen es sencilla y práctica, todavía puede mejorarse añadiendo multi-stage builds y otras buenas prácticas:

Dockerfile
# [ base ] #
FROM node:<VERSION_TAG>-alpine AS base
ENV DIR /bot
WORKDIR $DIR
# [ OS packages ] #
FROM base AS pkg
RUN apk update && apk add --no-cache dumb-init
# [ project builder ] #
FROM base AS build
COPY package*.json ./
## Ref: https://docs.npmjs.com/cli/v10/commands/npm-ci
RUN npm ci
## Ref: https://docs.npmjs.com/cli/v10/commands/npm-prune
RUN npm prune --production
RUN npm i -g typescript
COPY tsconfig.json seyfert.config.mjs ./
COPY /src ./src
## Build typescript
RUN tsc --project tsconfig.json
# [ production ready ] #
FROM base AS production
# Joining stages
## Packages
COPY --from=pkg /usr/bin/dumb-init /usr/bin/dumb-init
## Dependencies
COPY --from=build $DIR/node_modules ./node_modules
## Builder
COPY --from=build $DIR/dist ./dist
COPY --from=build $DIR/package.json ./package.json
COPY --from=build $DIR/seyfert.config.js ./seyfert.config.js
# Environment permissions
ENV NODE_ENV production
## Remove if your project needs root permissions
ENV USER node
USER $USER
# Run the application
ENTRYPOINT ["dumb-init", "node", "dist/index.js"]