Ratankumar10/code-execution-engine
0
1// ─── Docker Utility ──────────────────────────2// Verifies Docker availability and builds sandbox image3 4const { exec } = require("child_process");5const { promisify } = require("util");6const path = require("path");7const config = require("../config");8const logger = require("./logger.util");9 10const execAsync = promisify(exec);11 12/**13 * Verify Docker daemon is installed and running14 */15async function verifyDocker() {16 try {17 const { stdout } = await execAsync(18 'docker info --format "{{.ServerVersion}}"',19 );20 logger.info(`🐳 Docker available (v${stdout.trim()})`);21 } catch (err) {22 logger.error("❌ Docker is not available!");23 logger.error(" Make sure Docker is installed and the daemon is running.");24 logger.error(" Install: https://docs.docker.com/engine/install/");25 throw new Error("Docker is required but not available");26 }27}28 29/**30 * Build the sandbox Docker image if it doesn't already exist31 */32async function buildSandboxImage() {33 try {34 // Check if image already exists35 await execAsync(36 `docker image inspect ${config.SANDBOX_IMAGE} > /dev/null 2>&1`,37 );38 logger.info(`🐳 Sandbox image '${config.SANDBOX_IMAGE}' already exists`);39 } catch {40 // Image doesn't exist — build it41 logger.info(`🔨 Building sandbox image '${config.SANDBOX_IMAGE}'...`);42 logger.info(" This may take 1-2 minutes on first run...");43 44 const sandboxDir = path.join(__dirname, "..", "..", "sandbox");45 46 try {47 await execAsync(`docker build -t ${config.SANDBOX_IMAGE} ${sandboxDir}`, {48 timeout: 300000, // 5 minute timeout for build49 });50 logger.info("✅ Sandbox image built successfully");51 } catch (buildErr) {52 logger.error("❌ Failed to build sandbox image:", buildErr.message);53 throw new Error("Failed to build sandbox Docker image");54 }55 }56}57 58module.exports = { verifyDocker, buildSandboxImage };59 