
Wie du eine Bun App mit Docker deployst

Deine Bun-App zu dockerisieren ist ein Kinderspiel mit diesem super minimalen Dockerfile. Folge mir auf der Reise, um es produktionsreif zu machen! 🐳🚀
FROM oven/bun
COPY . .
RUN bun install
CMD ["bun", "index.ts"]
Stelle sicher, dass du index.ts
zu deinem Einstiegspunkt änderst und baue es dann so:
docker build -t bun-minimal .
Verbesserungen
Wie immer bei Docker kannst du dein Docker-Image auf ein paar einfache Arten verbessern. Schauen wir uns die zwei offensichtlichsten Wege an: nur das kopieren, was du brauchst (verbessert Caching!) und Multi-Stage-Builds (verbessert die Image-Größe!) 🚀
Nur das kopieren, was du brauchst
Ein Großteil der Zeit, die dein Docker-Build braucht, kommt von teuren I/O-Operationen oder der Unfähigkeit, einzelne Schritte deines Build-Prozesses zu cachen.
.dockerignore
🤷
Erstelle zuerst eine .dockerignore
-Datei mit allem, was du nicht in deinem Docker-Image haben willst. Das beinhaltet normalerweise Sachen wie deine node_modules
, kompilierte Dateien oder Dokumentation. Schreibe einfach die Ordnernamen, die ignoriert werden sollen, in eine Datei oder kopiere eine existierende.
node_modules
README.md
LICENSE
Getrennte Copy-Schritte
Wenn du aktiv an deiner App entwickelst und ständig dein Docker-Image neu bauen musst, ist die Wahrscheinlichkeit groß, dass sich dein Code viel öfter ändert als deine Dependencies. Du kannst von dieser Tatsache profitieren, indem du die Install- und Build-Schritte trennst. Docker wird dann nur deine Dependencies neu installieren, wenn sie sich tatsächlich geändert haben! 🥳
FROM oven/bun
# Kopiere die Lock- und Package-Datei
COPY bun.lockb .
COPY package.json .
# Installiere Dependencies
RUN bun install --frozen-lockfile
# Kopiere deinen Source Code
# Wenn sich nur Dateien im src-Ordner geändert haben, ist das der einzige Schritt, der ausgeführt wird!
COPY src ./src
CMD ["bun", "index.ts"]
Multi-Stage Builds
Wenn du etwas schicker sein willst oder ein kleineres Docker-Image brauchst, kannst du auch Bun verwenden, um eine ausführbare Datei zu bündeln. Das wird deinen Code zu einer eigenständigen Binary kompilieren, die die Bun-Runtime enthält. Du kannst dann einen Multi-Stage-Build erstellen und deine Image-Größe um etwa 35% reduzieren.
Wir nehmen das Dockerfile vom vorherigen Schritt als Vorlage, erweitern es aber, indem wir nicht bun run, sondern bun build verwenden. Wir kopieren dann die kompilierte Binary und erstellen ein neues Ubuntu-Image, das nur diese Binary enthält. Dieser einfache Schritt reduziert unsere Build-Größe um 88 Megabyte! 🤯
FROM oven/bun AS build # tagge es als build
WORKDIR /app
COPY bun.lockb .
COPY package.json .
RUN bun install --frozen-lockfile
COPY src ./src
# kompiliere alles zu einer Binary namens cli, die die Bun-Runtime enthält
RUN bun build ./src/index.ts --compile --outfile cli
FROM ubuntu:22.04 # verwende ein kleineres Image ohne Bun
WORKDIR /app
# kopiere die kompilierte Binary vom Build-Image
COPY --from=build /app/cli /app/cli
# führe die Binary aus!
CMD ["/app/cli"]
Nächste Schritte
Wie war deine Erfahrung bei der Entwicklung und dem Deployment von Bun? Ich habe es bisher wirklich genossen, obwohl noch viel Arbeit nötig ist, um es wirklich großartig zu machen. Ich würde gerne deine Meinungen hören!
Wenn du weitermachen willst, schau dir den nächsten Blog-Post an, wo du lernst, wie du deine dockerisierte Bun-App auf Hetzner deployst mit Sliplane!