This commit is contained in:
RGJorge
2026-05-03 23:47:38 +00:00
parent 019a48c89e
commit ca391c97c3
+25 -2
View File
@@ -8,6 +8,27 @@ import { docker, discoverServices, discoverConnections, getContainerLogs, stream
import { pollStats, watchDockerEvents } from "./watcher"; import { pollStats, watchDockerEvents } from "./watcher";
import type { Service, WSMessage } from "../shared/types"; import type { Service, WSMessage } from "../shared/types";
/** Build env-file args for docker compose by detecting .env files next to the compose file */
function findEnvFileArgs(composeFile: string): string[] {
const dir = path.dirname(composeFile);
const baseName = path.basename(composeFile, path.extname(composeFile)); // e.g. "docker-compose.prod"
const candidates: string[] = [];
// Prefer specific env file matching compose name (e.g. .env.prod for docker-compose.prod.yml)
const suffix = baseName.replace(/^docker-compose\.?/, ""); // "prod" or ""
if (suffix) {
candidates.push(path.join(dir, `.env.${suffix}`));
}
candidates.push(path.join(dir, ".env"));
for (const envFile of candidates) {
if (fs.existsSync(envFile)) {
return ["--env-file", envFile];
}
}
return [];
}
const app = new Hono(); const app = new Hono();
// ── Compression ── // ── Compression ──
@@ -126,7 +147,8 @@ app.post("/api/containers/:id/rebuild", async (c) => {
if (!composeFile || !serviceName) { if (!composeFile || !serviceName) {
return c.json({ error: "Not a Compose service — rebuild requires docker-compose" }, 400); return c.json({ error: "Not a Compose service — rebuild requires docker-compose" }, 400);
} }
const proc = Bun.spawn(["docker", "compose", "-f", composeFile, "up", "--build", "-d", serviceName], { const envArgs = findEnvFileArgs(composeFile);
const proc = Bun.spawn(["docker", "compose", "-f", composeFile, ...envArgs, "up", "--build", "-d", serviceName], {
stdout: "pipe", stdout: "pipe",
stderr: "pipe", stderr: "pipe",
}); });
@@ -155,7 +177,8 @@ app.post("/api/containers/:id/remove", async (c) => {
await container.remove({ force: true }); await container.remove({ force: true });
return c.json({ ok: true }); return c.json({ ok: true });
} }
const proc = Bun.spawn(["docker", "compose", "-f", composeFile, "rm", "-sf", serviceName], { const envArgs = findEnvFileArgs(composeFile);
const proc = Bun.spawn(["docker", "compose", "-f", composeFile, ...envArgs, "rm", "-sf", serviceName], {
stdout: "pipe", stdout: "pipe",
stderr: "pipe", stderr: "pipe",
}); });