2022-08-25 21:15:48 +00:00
|
|
|
import * as Docker from 'dockerode';
|
|
|
|
import * as tar from 'tar-stream';
|
|
|
|
|
2022-09-08 02:25:10 +00:00
|
|
|
import { strict as assert } from 'assert';
|
|
|
|
|
2022-08-25 21:15:48 +00:00
|
|
|
// Creates an image from scratch with just some labels
|
|
|
|
export async function createDockerImage(
|
|
|
|
name: string,
|
|
|
|
labels: [string, ...string[]],
|
|
|
|
docker = new Docker(),
|
2022-10-19 15:05:52 +00:00
|
|
|
extra = [] as string[], // Additional instructions to add to the dockerfile
|
2022-09-08 02:25:10 +00:00
|
|
|
): Promise<string> {
|
2022-08-25 21:15:48 +00:00
|
|
|
const pack = tar.pack(); // pack is a streams2 stream
|
|
|
|
pack.entry(
|
|
|
|
{ name: 'Dockerfile' },
|
2022-10-19 15:05:52 +00:00
|
|
|
['FROM scratch']
|
|
|
|
.concat(labels.map((l) => `LABEL ${l}`))
|
|
|
|
.concat(extra)
|
|
|
|
.join('\n'),
|
2022-08-25 21:15:48 +00:00
|
|
|
(err) => {
|
|
|
|
if (err) {
|
|
|
|
throw err;
|
|
|
|
}
|
|
|
|
pack.finalize();
|
|
|
|
},
|
|
|
|
);
|
|
|
|
// Create an empty image
|
|
|
|
const stream = await docker.buildImage(pack, { t: name });
|
|
|
|
return await new Promise((resolve, reject) => {
|
2022-09-08 02:25:10 +00:00
|
|
|
docker.modem.followProgress(stream, (err: any, res: any) => {
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
const ids = res
|
|
|
|
.map((evt: any) => evt?.aux?.ID ?? null)
|
|
|
|
.filter((id: string | null) => !!id);
|
|
|
|
|
|
|
|
assert(ids.length > 0, 'expected at least an image id after building');
|
|
|
|
resolve(ids[ids.length - 1]);
|
|
|
|
});
|
2022-08-25 21:15:48 +00:00
|
|
|
});
|
|
|
|
}
|