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.
De plus, le script npm ressemble à ceci.
{
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
}
}
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
À partir de là, créez une image pour la production.
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
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
Je ne sais pas si c'est Dockernize ou Dockerize.
Recommended Posts