Nuxt als Container deployen

Zwei Schritte:

  1. das Nuxt-Projekt bauen. Das landet dann im .output-Verzeichnis.
    Nur dieses Verzeichnis muss in den Container.
  2. 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: DockerfileCode 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.

Kategorien:DockerJavascript