Nuxt als Container deployen
Zwei Schritte:
- das Nuxt-Projekt bauen. Das landet dann im
.output
-Verzeichnis.
Nur dieses Verzeichnis muss in den Container. - den gebauten Server in einen Container packen
Schritt 1 kann entweder via Multistage Builds oder in der CI/CD Pipeline realisiert werden – das ist Geschmacksache.
Multistage Builds
Hier ein passendes Dockerfile, welches erst die Anwendung in einem Container baut, und das fertig gebaute Serverdings dann in einen zweiten Container schubst.
FROM node:22-alpine as builder
WORKDIR /app
COPY package.json /app/
COPY package-lock.json /app/
RUN npm install
ADD . /app
RUN npm run build
FROM node:22-alpine
WORKDIR /app
RUN chown node:node /app && chmod 0770 /app
COPY --from=builder --chown=node:node /app/.output/server app/.output/server
COPY --from=builder --chown=node:node /app/.output/public app/.output/public
USER node
ENV HOST 0.0.0.0
EXPOSE 3000
ENTRYPOINT ["node", "/app/.output/server/index.mjs"]
Code language: JavaScript (javascript)
Der Vorteil bei diesem aus zwei Schritten bestehenden “erst bauen, dann das gebaute kopieren” besteht darin, dass wir einen möglichst kleinen Container haben.
Theoretisch hätte man auch den ungebauten Server mit drin lassen können, nur kostet das ja mindestens doppelt unnötigen Speicherplatz (auf Dockerhub, und auf dem Docker Host).
Via CI
In diesem Fall drone:
steps:
- name: build-server
image: node:22
commands:
- npm install
- npm run build
- name: build-container
image: plugins/docker
settings:
username:
from_secret: CI_USERNAME
password:
from_secret: CI_PASSWORD
# registry: "xxx.yyy.de"
# repo: "xxx.yyy.de/ou/container"
tags:
- latest
dockerfile: Dockerfile
Code language: PHP (php)
Und das Dockerfile:
FROM node:22-alpine
WORKDIR /home/node/app
RUN mkdir server && mkdir public && chown node:node -R * && chmod 0777 -R *
USER node
COPY --chown=node:node ./.output/server/package.json ./server
RUN cd server && npm install && cd ..
COPY --chown=node:node ./.output/public ./public
COPY --chown=node:node ./.output/server ./server
ENV HOST 0.0.0.0
EXPOSE 3000
CMD [ "node", "./server/index.mjs" ]
Code language: PHP (php)
Hinweis: da der drone host und der Container ggfs. unterschiedliche OS sind, habe ich die package.json zuerst kopiert, nen npm install
gemacht (um für das OS passende Packages zu ziehen) und dann die Server-files kopiert.
Bei dem Multistage oben war das nicht erforderlich, da haben wir den node_modules Ordner mitgenommen, da beide auf dem selben Basiscontainer basieren.