[Next.js] Dockerniser le projet suivant

J'ai décidé de déployer le projet Next.js dans l'environnement k8s, j'ai donc beaucoup écrit. Cette fois, j'utilise du fil au lieu de npm.

environnement

De plus, le script npm ressemble à ceci.

{
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start"
  }
}

Développer sur Docker

Lors du développement avec Node dans Docker. Le développement peut être fait sans se soucier de la version du nœud local, mais c'est gênant car l'éditeur local ne peut pas lire la définition de type.

FROM node:12.18.4

WORKDIR /app
#Copiez les fichiers nécessaires pour installer le package npm
COPY package.json yarn.lock ./
#Si vous utilisez npm, procédez comme suit
# COPY package*.json ./
RUN yarn install
EXPOSE 3000
CMD ["yarn", "dev"]
docker build --rm -t next_dev:latest -f path/to/Dockerfile
docker run -p 3000:3000 -v $PWD:/app -it next_dev:latest

Construire pour la production

À partir de là, créez une image pour la production.

J'essaierai de le faire pour le moment

Essayez de faire comme d'habitude. Puisque c'est pour la production, utilisez l'image alpine. Le contexte de construction (l'emplacement des fichiers envoyés au démon Docker lors de la construction de Docker) est le dossier du projet.

FROM node:12.18.4-alpine

WORKDIR /app
#Copiez toutes les sources locales
COPY . /app
#Installer le package npm, construire pour la production
RUN yarn install && NODE_ENV=production yarn build
EXPOSE 3000

CMD ["yarn", "start"]

--Construire et exécuter

Pour créer, exécutez la commande suivante dans le dossier du projet.

$ docker build --rm -t next_prod:latest -f path/to/Dockerfile

Exécutez la commande suivante pour l'exécuter en tant que démon.

$ docker run -d -p 3000:3000 next_prod:latest

Le serveur lui-même fonctionne avec cela, mais la taille de l'image Docker est de 900 Mo en l'état, donc je veux la rendre un peu plus mince. (Bien sûr, la taille de l'image dépend du contenu du projet Next.js)

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
next_prod         latest              d211c6246173        6 minutes ago       899MB

construction en plusieurs étapes

Réduisez la taille de l'image Docker avec la construction en plusieurs étapes.

FROM node:12.18.4-alpine AS base

#Installez le package
WORKDIR /base
COPY . .
RUN yarn install

#Construire pour la production
FROM base AS build
WORKDIR /build
COPY --from=base /base ./
RUN NODE_ENV=production yarn build

#Copiez l'artefact de construction et démarrez le serveur
FROM node:12.18.4-alpine AS production
ENV NODE_ENV=production
WORKDIR /app
#Je ne copierai que les artefacts de construction
COPY --from=build /build/package.json /build/yarn.lock ./
COPY --from=build /build/.next ./.next
COPY --from=build /build/public ./public
# node_Il n'y a pas moins de modules dans cette image, donc suivant.Nécessaire pour exécuter le serveur js
RUN yarn add next

EXPOSE 3000
CMD ["yarn", "start"]

--Construire et exécuter

$ docker build --rm -t next_prod:msb -f path/to/Dockerfile
$ docker run -d -p 3000:3000 next_prod:mdb

Cela a rendu l'image beaucoup plus mince. La capacité de chaque image ressemble à ceci.

$ docker images
REPOSITORY          TAG           SIZE
next_prod           msb           574MB    # production multi stage build
next_prod           latest        899MB    # production build
next_dev            latest        1.44GB   # dev

en conclusion

Je ne sais pas si c'est Dockernize ou Dockerize.

Recommended Posts

[Next.js] Dockerniser le projet suivant