in app/lib/server/processors/DockerJobExecutor.ts [282:330]
private async getContainerLogs(
container: any,
jobId: string
): Promise<string> {
// Get logs stream
const stream = await container.logs({
stdout: true,
stderr: true,
follow: true,
});
return new Promise((resolve, reject) => {
let output = "";
const jobStore = getJobStore();
stream.on("data", async (chunk: Buffer) => {
// Docker multiplexes stdout/stderr, need to handle the stream format
const cleanChunk = this.cleanDockerStreamChunk(chunk);
output += cleanChunk;
// Store incremental logs in real-time
try {
await jobStore.setJobLogs(jobId, output);
} catch (error) {
console.error(
`Failed to store incremental logs for job ${jobId}:`,
error
);
}
});
stream.on("end", () => {
console.log(`✅ Container execution completed for job ${jobId}`);
console.log(`📋 Total output length: ${output.length} characters`);
resolve(output);
});
stream.on("error", (error: Error) => {
console.error(`🚨 Container error for job ${jobId}:`, error);
reject(error);
});
// Timeout after configured time
setTimeout(() => {
container.kill().catch(console.error); // Attempt to kill the container
reject(new Error("Container execution timeout"));
}, DOCKER.TIMEOUT);
});
}