import Docker from 'dockerode';
import { DockerClient } from '../docker/client.js';
export interface ImageBuildOptions {
dockerfile?: string;
t?: string;
tags?: string[];
buildargs?: Record<string, string>;
labels?: Record<string, string>;
nocache?: boolean;
rm?: boolean;
forcerm?: boolean;
pull?: boolean;
platform?: string;
}
export interface ImagePullOptions {
authconfig?: Docker.AuthConfig;
}
export interface ImagePushOptions {
authconfig?: Docker.AuthConfig;
}
export class ImageManager {
constructor(private dockerClient: DockerClient) {}
private getDocker(): Docker {
return this.dockerClient.getDocker();
}
async listImages(options: { all?: boolean; filters?: Record<string, string[]> } = {}): Promise<Docker.ImageInfo[]> {
const docker = this.getDocker();
return await docker.listImages({
all: options.all ?? false,
filters: options.filters ? JSON.stringify(options.filters) : undefined,
});
}
async buildImage(context: string, options: ImageBuildOptions = {}): Promise<NodeJS.ReadableStream> {
const docker = this.getDocker();
const buildOptions: Docker.ImageBuildOptions = {
dockerfile: options.dockerfile || 'Dockerfile',
t: options.t || options.tags?.[0],
buildargs: options.buildargs,
labels: options.labels,
nocache: options.nocache ?? false,
rm: options.rm ?? true,
forcerm: options.forcerm ?? false,
pull: options.pull ?? false,
platform: options.platform,
};
return await docker.buildImage(context, buildOptions);
}
async pullImage(name: string, options: ImagePullOptions = {}): Promise<NodeJS.ReadableStream> {
const docker = this.getDocker();
return await docker.pull(name, {
authconfig: options.authconfig,
});
}
async pushImage(name: string, options: ImagePushOptions = {}): Promise<NodeJS.ReadableStream> {
const docker = this.getDocker();
const image = docker.getImage(name);
return await image.push({
authconfig: options.authconfig,
});
}
async tagImage(name: string, repo: string, tag?: string): Promise<void> {
const docker = this.getDocker();
const image = docker.getImage(name);
await image.tag({
repo,
tag: tag || 'latest',
});
}
async removeImage(name: string, options?: { force?: boolean }): Promise<void> {
const docker = this.getDocker();
const image = docker.getImage(name);
await image.remove({
force: options?.force ?? false,
});
}
async inspectImage(name: string): Promise<Docker.ImageInspectInfo> {
const docker = this.getDocker();
const image = docker.getImage(name);
return await image.inspect();
}
async getImageHistory(name: string): Promise<any[]> {
const docker = this.getDocker();
const image = docker.getImage(name);
return await image.history();
}
}