Loading...
Wie du eine Bun App mit Docker deployst

Wie du eine Bun App mit Docker deployst

Jonas Scholz - Co-Founder von sliplane.ioJonas Scholz
4 min

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!

Willkommen in der Container-Cloud

Sliplane macht es einfach, Container in der Cloud zu deployen und bei Bedarf zu skalieren. Probier es jetzt aus!