import Docker from 'dockerode';
import { DockerClient } from '../docker/client.js';
export interface ExecCreateOptions {
Cmd: string[];
AttachStdout?: boolean;
AttachStderr?: boolean;
AttachStdin?: boolean;
Tty?: boolean;
Env?: string[];
WorkingDir?: string;
User?: string;
Privileged?: boolean;
Detach?: boolean;
}
export class ExecManager {
constructor(private dockerClient: DockerClient) {}
private getDocker(): Docker {
return this.dockerClient.getDocker();
}
async createExec(containerId: string, options: ExecCreateOptions): Promise<any> {
const docker = this.getDocker();
const container = docker.getContainer(containerId);
const execOptions: any = {
Cmd: options.Cmd,
AttachStdout: options.AttachStdout ?? true,
AttachStderr: options.AttachStderr ?? true,
AttachStdin: options.AttachStdin ?? false,
Tty: options.Tty ?? false,
};
if (options.Env) execOptions.Env = options.Env;
if (options.WorkingDir) execOptions.WorkingDir = options.WorkingDir;
if (options.User) execOptions.User = options.User;
if (options.Privileged !== undefined) execOptions.Privileged = options.Privileged;
const exec = await container.exec(execOptions);
return exec;
}
async startExec(execId: string, options: { Detach?: boolean; Tty?: boolean } = {}): Promise<NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream> {
const docker = this.getDocker();
const exec = docker.getExec(execId);
return await exec.start({
Detach: options.Detach ?? false,
Tty: options.Tty ?? false,
});
}
async inspectExec(execId: string): Promise<Docker.ExecInspectInfo> {
const docker = this.getDocker();
const exec = docker.getExec(execId);
return await exec.inspect();
}
}