Перейти до вмісту

Розгортання застосунку

Запакуйте сервер на JavaScript або TypeScript в образ контейнера на основі elide.dev/elide, з оточенням, прапорцями пісочниці, журналами й перевіркою працездатності.

На цій сторінці

На цій сторінці сервер на TypeScript пакується в образ контейнера на основі elide.dev/elide.

Написання застосунку

// 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"
  }
}

Один раз виконайте elide install --ecosystems=npm, щоб записати aube-lock.yaml.

Написання Dockerfile

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
РядокНавіщо
FROM elide.dev/elide:1.6.0Точка входу образу — elide, тому CMD містить лише її аргументи. Теги: Образи контейнерів.
RUN elide install --ecosystems=npmВстановлює залежності всередині образу. node_modules посилається на /root/.cache/aube, тому node_modules із хоста не працюватиме.
--host 0.0.0.0Обробник, експортований за замовчуванням, прив’язується до 127.0.0.1, який недоступний ззовні контейнера.
--no-tuiБез цього прапорця docker run -t запускає термінальний інтерфейс, і вивід застосунку не потрапляє в docker logs.
HEALTHCHECKВ образі немає curl і wget; перевірку виконує короткий скрипт Elide.
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 виводить healthy, щойно проходить перша перевірка. docker stop зупиняє сервер менш ніж за секунду з кодом виходу 143.

Передавання змінних оточення

process.env містить змінні контейнера; передавайте їх через docker run -e NAME=value або --env-file .env. Elide не читає файли .env і не задає NODE_ENV. Для локальних запусків завантажте файл у коді:

import { existsSync } from "node:fs";

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

Без перевірки process.loadEnvFile() кидає ENOENT: no such file or directory, open '.env', якщо файлу немає. Див. Змінні оточення.

Обмеження сервера

Програми працюють без обмежень, доки не задано прапорець пісочниці. Дайте серверу те, що йому потрібно, і нічого більше:

ПрапорецьУ Dockerfile вище
--allow-read=PATHS/app і сховище npm /root/.cache/aube.
--allow-net=HOSTSВихідні хости. Для прослуховування порту дозвіл не потрібен.
--allow-run=CMDSНе задано: підпроцеси залишаються дозволеними. Вкажіть список, щоб обмежити їх.
--deny-net=HOSTSХости, заблоковані навіть за наявності дозволу, наприклад --deny-net=169.254.169.254.
--max-mem=SIZE, --timeout=DURATIONРозмір купи й загальний час роботи.

Глобальні прапорці вказуються перед командою (serve, run). --deny-net і --deny-run потребують форми з =. Якщо сховища npm немає в --allow-read, сервер зупиняється під час запуску:

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

Заблокований вихідний виклик називає прапорець:

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

Усі прапорці: Пісочниця та обмеження.

Читання журналів

console.log пише в stdout, а console.error — у stderr; docker logs показує обидва потоки:

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

elide serve --no-tui не виводить журнал доступу, а обробник, який кинув виняток, відповідає 500, не виводячи помилку. Записуйте запити й помилки в журнал із застосунку або експортуйте спани запитів, метрики й помилки через OpenTelemetry.

Розгортання застосунку JVM

  • Зберіть образ JVM з elide.pkl за допомогою артефакту ContainerImage: JVM-контейнери.
  • Скомпілюйте нативний виконуваний файл: Native Image.

Чи була ця сторінка корисною?