diff --git a/src/components/c2d/compute_engine_docker.ts b/src/components/c2d/compute_engine_docker.ts index cd9ee4c60..2f20300c6 100644 --- a/src/components/c2d/compute_engine_docker.ts +++ b/src/components/c2d/compute_engine_docker.ts @@ -619,6 +619,7 @@ export class C2DEngineDocker extends C2DEngine { try { const dockerImage = this.docker.getImage(image) await dockerImage.remove({ force: true }) + await this.db.deleteImage(image) cleaned++ CORE_LOGGER.info(`Successfully removed old image: ${image}`) } catch (e) { @@ -1826,16 +1827,6 @@ export class C2DEngineDocker extends C2DEngine { } catch (e) { CORE_LOGGER.error('Container volume not found! ' + e.message) } - if (job.algorithm?.meta.container && job.algorithm?.meta.container.dockerfile) { - const image = getAlgorithmImage(job.algorithm, job.jobId) - if (image) { - try { - await this.docker.getImage(image).remove({ force: true }) - } catch (e) { - CORE_LOGGER.error('Could not delete image: ' + image + ' : ' + e.message) - } - } - } try { // remove folders rmSync(this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/inputs', { @@ -2136,6 +2127,9 @@ export class C2DEngineDocker extends C2DEngine { await new Promise((resolve, reject) => { buildStream.on('end', () => { CORE_LOGGER.debug(`Image '${job.containerImage}' built successfully.`) + this.updateImageUsage(job.containerImage).catch((e) => { + CORE_LOGGER.debug(`Failed to track image usage: ${e.message}`) + }) resolve() }) buildStream.on('error', (err) => { diff --git a/src/components/database/C2DDatabase.ts b/src/components/database/C2DDatabase.ts index 4916763ed..88ff5be2f 100644 --- a/src/components/database/C2DDatabase.ts +++ b/src/components/database/C2DDatabase.ts @@ -93,6 +93,10 @@ export class C2DDatabase extends AbstractDatabase { return await this.provider.updateImage(image) } + async deleteImage(image: string): Promise { + return await this.provider.deleteImage(image) + } + async getOldImages(retentionDays: number): Promise { return await this.provider.getOldImages(retentionDays) } diff --git a/src/components/database/sqliteCompute.ts b/src/components/database/sqliteCompute.ts index b73fa85f0..4b1d0bebf 100644 --- a/src/components/database/sqliteCompute.ts +++ b/src/components/database/sqliteCompute.ts @@ -165,6 +165,23 @@ export class SQLiteCompute implements ComputeDatabaseProvider { }) } + deleteImage(image: string): Promise { + const deleteSQL = ` + DELETE FROM docker_images WHERE image = ?; + ` + return new Promise((resolve, reject) => { + this.db.run(deleteSQL, [image], (err) => { + if (err) { + DATABASE_LOGGER.error(`Could not delete image ${image}: ${err.message}`) + reject(err) + } else { + DATABASE_LOGGER.debug(`Deleted image ${image}`) + resolve() + } + }) + }) + } + getOldImages(retentionDays: number = 7): Promise { const cutoffTimestamp = Math.floor(Date.now() / 1000) - retentionDays * 24 * 60 * 60 const selectSQL = `