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| Zeile | Grund |
|---|---|
FROM elide. | Der Einstiegspunkt des Images ist elide, daher enthält CMD nur dessen Argumente. Tags: Container-Images. |
RUN elide install --ecosystems= | Installiert innerhalb des Images. node_modules verlinkt nach /root/.cache/aube, daher würde ein node_modules vom Host nicht funktionieren. |
--host 0.0.0.0 | Ein per Default-Export bereitgestellter Handler bindet an 127.0.0.1, das von außerhalb des Containers nicht erreichbar ist. |
--no-tui | Ohne das Flag startet docker run -t die Terminal-Oberfläche, und die Ausgabe der App erreicht docker logs nie. |
HEALTHCHECK | Das 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:
| Flag | Im Dockerfile oben |
|---|---|
--allow-read=PATHS | /app und der npm-Speicher /root/.cache/aube. |
--allow-net=HOSTS | Ausgehende Hosts. Das Lauschen auf einem Port braucht keine Freigabe. |
--allow-run=CMDS | Nicht angegeben: Unterprozesse bleiben erlaubt. Geben Sie eine Liste an, um sie einzuschränken. |
--deny-net=HOSTS | Hosts, die auch dann gesperrt sind, wenn sie erlaubt sind, z. B. --deny-net=. |
--max-mem=SIZE, --timeout=DURATION | Heap-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/honoEin blockierter ausgehender Aufruf nennt das Flag:
fetch to '169.254.169.254:80' denied by --deny-netAlle 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.pklmit einemContainerImage-Artefakt: JVM-Container. - Kompilieren Sie eine native ausführbare Datei: Native Image.