Zum Inhalt springen

App bereitstellen

Einen JavaScript- oder TypeScript-Server als Container-Image auf Basis von elide.dev/elide verpacken, mit Umgebung, Sandbox-Flags, Logs und Health-Check.

Auf dieser Seite

Diese Seite verpackt einen TypeScript-Server als Container-Image auf Basis von elide.dev/elide.

Die App schreiben

// server.ts
import { Hono } from "hono";

const app = new Hono();

app.use(async (c, next) => {
  await next();
  console.log(JSON.stringify({ method: c.req.method, path: c.req.path, status: c.res.status }));
});

app.get("/healthz", (c) => c.text("ok"));
app.get("/", (c) => c.json({ greeting: process.env.GREETING ?? "hello" }));

export default app;
// healthcheck.mjs
const res = await fetch("http://127.0.0.1:8080/healthz");
process.exit(res.ok ? 0 : 1);
{
  "name": "deploy-app",
  "type": "module",
  "dependencies": {
    "hono": "^4.7.0"
  }
}

Führen Sie einmal elide install --ecosystems=npm aus, um aube-lock.yaml zu schreiben.

Das Dockerfile schreiben

FROM elide.dev/elide:1.6.0
WORKDIR /app
COPY package.json aube-lock.yaml ./
RUN elide install --ecosystems=npm
COPY . .
EXPOSE 8080
HEALTHCHECK --interval=10s --timeout=3s CMD ["elide", "healthcheck.mjs"]
CMD ["--allow-read=/app,/root/.cache/aube", "--allow-net=api.example.com", "serve", "--no-tui", "--host", "0.0.0.0", "--port", "8080", "server.ts"]
# .dockerignore
node_modules
.env
ZeileGrund
FROM elide.dev/elide:1.6.0Der Einstiegspunkt des Images ist elide, daher enthält CMD nur dessen Argumente. Tags: Container-Images.
RUN elide install --ecosystems=npmInstalliert innerhalb des Images. node_modules verlinkt nach /root/.cache/aube, daher würde ein node_modules vom Host nicht funktionieren.
--host 0.0.0.0Ein per Default-Export bereitgestellter Handler bindet an 127.0.0.1, das von außerhalb des Containers nicht erreichbar ist.
--no-tuiOhne das Flag startet docker run -t die Terminal-Oberfläche, und die Ausgabe der App erreicht docker logs nie.
HEALTHCHECKDas Image enthält weder curl noch wget; ein kurzes Elide-Skript übernimmt die Prüfung.
docker build -t my-app .
docker run -d --name my-app -p 8080:8080 -e GREETING=hi my-app
curl http://127.0.0.1:8080/
{"greeting":"hi"}

docker inspect --format '{{.State.Health.Status}}' my-app gibt healthy aus, sobald die erste Prüfung besteht. docker stop beendet den Server innerhalb einer Sekunde mit dem Exit-Code 143.

Umgebungsvariablen übergeben

process.env enthält die Variablen des Containers; übergeben Sie sie mit docker run -e NAME=value oder --env-file .env. Elide liest keine .env-Dateien und setzt kein NODE_ENV. Für lokale Ausführungen laden Sie die Datei im Code:

import { existsSync } from "node:fs";

if (existsSync(".env")) process.loadEnvFile();

process.loadEnvFile() ohne die Prüfung wirft ENOENT: no such file or directory, open '.env', wenn die Datei fehlt. Siehe Umgebungsvariablen.

Den Server einschränken

Programme laufen ohne Einschränkung, bis ein Sandbox-Flag angegeben wird. Geben Sie einem Server, was er braucht, und nichts darüber hinaus:

FlagIm Dockerfile oben
--allow-read=PATHS/app und der npm-Speicher /root/.cache/aube.
--allow-net=HOSTSAusgehende Hosts. Das Lauschen auf einem Port braucht keine Freigabe.
--allow-run=CMDSNicht angegeben: Unterprozesse bleiben erlaubt. Geben Sie eine Liste an, um sie einzuschränken.
--deny-net=HOSTSHosts, die auch dann gesperrt sind, wenn sie erlaubt sind, z. B. --deny-net=169.254.169.254.
--max-mem=SIZE, --timeout=DURATIONHeap-Größe und Gesamtdauer der Ausführung.

Globale Flags stehen vor dem Befehl (serve, run). --deny-net und --deny-run brauchen die Form mit =. Fehlt der npm-Speicher in --allow-read, bricht der Server beim Start ab:

Error: Filesystem read denied by policy: /app/node_modules/hono

Ein blockierter ausgehender Aufruf nennt das Flag:

fetch to '169.254.169.254:80' denied by --deny-net

Alle Flags: Sandbox und Limits.

Logs lesen

console.log schreibt nach stdout und console.error nach stderr; docker logs zeigt beides:

{"method":"GET","path":"/healthz","status":200}
{"method":"GET","path":"/","status":200}

elide serve --no-tui gibt kein Zugriffslog aus, und ein Handler, der eine Ausnahme wirft, antwortet mit 500, ohne den Fehler auszugeben. Protokollieren Sie Anfragen und Fehler in der App, oder exportieren Sie Anfrage-Spans, Metriken und Fehler mit OpenTelemetry.

Eine JVM-App bereitstellen

  • Bauen Sie ein JVM-Image aus elide.pkl mit einem ContainerImage-Artefakt: JVM-Container.
  • Kompilieren Sie eine native ausführbare Datei: Native Image.

War diese Seite hilfreich?