snyk-docker-plugin
Version:
Snyk CLI docker plugin
101 lines • 3.74 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.Docker = void 0;
const docker_registry_v2_client_1 = require("@snyk/docker-registry-v2-client");
const snyk_docker_pull_1 = require("@snyk/snyk-docker-pull");
const Debug = require("debug");
const Modem = require("docker-modem");
const fs_1 = require("fs");
const subProcess = require("./sub-process");
const debug = Debug("snyk");
class Docker {
static async binaryExists() {
try {
await subProcess.execute("docker", ["version"]);
return true;
}
catch (e) {
return false;
}
}
async pull(registry, repo, tag, imageSavePath, username, password, platform) {
const dockerPull = new snyk_docker_pull_1.DockerPull();
const platformTokens = platform ? platform.split("/") : undefined;
let os = "linux";
let architecture = "amd64";
let variant;
if (platformTokens) {
const platformTokensLen = platformTokens.length;
if (platformTokensLen <= 1) {
throw Error("Invalid platform string. Please provide a platform name that follows os/arch[/variant] format.");
}
os = platformTokens[0];
architecture = platformTokens[1];
variant = platformTokens[2];
}
const opt = {
username,
password,
loadImage: false,
platform: platformTokens ? { os, architecture, variant } : undefined,
imageSavePath,
reqOptions: {
acceptManifest: [
docker_registry_v2_client_1.contentTypes.OCI_MANIFEST_V1,
docker_registry_v2_client_1.contentTypes.OCI_INDEX_V1,
docker_registry_v2_client_1.contentTypes.MANIFEST_V2,
docker_registry_v2_client_1.contentTypes.MANIFEST_LIST_V2,
].join(","),
},
};
return await dockerPull.pull(registry, repo, tag, opt);
}
async pullCli(targetImage, options) {
const args = ["pull", targetImage];
if (options === null || options === void 0 ? void 0 : options.platform) {
args.push(`--platform=${options.platform}`);
}
return subProcess.execute("docker", args);
}
async save(targetImage, destination) {
const request = {
path: `/images/${targetImage}/get?`,
method: "GET",
isStream: true,
statusCodes: {
200: true,
400: "bad request",
404: "not found",
500: "server error",
},
};
debug(`Docker.save: targetImage: ${targetImage}, destination: ${destination}`);
const modem = new Modem();
return new Promise((resolve, reject) => {
modem.dial(request, (err, stream) => {
if (err) {
return reject(err);
}
const writeStream = (0, fs_1.createWriteStream)(destination);
writeStream.on("error", (err) => {
reject(err);
});
writeStream.on("finish", () => {
resolve();
});
stream.on("error", (err) => {
reject(err);
});
stream.on("end", () => {
writeStream.end();
});
stream.pipe(writeStream);
});
});
}
async inspectImage(targetImage) {
return subProcess.execute("docker", ["inspect", targetImage]);
}
}
exports.Docker = Docker;
//# sourceMappingURL=docker.js.map
;