diff --git a/common-npm-packages/docker-common/containerimageutils.ts b/common-npm-packages/docker-common/containerimageutils.ts index bdad3fef..3019a959 100644 --- a/common-npm-packages/docker-common/containerimageutils.ts +++ b/common-npm-packages/docker-common/containerimageutils.ts @@ -253,3 +253,48 @@ export function getImageIdFromBuildOutput(output: string): string { return ""; } +export function getBaseImageDigestDockerFile(dockerFileContent: string): string { + // This method checks if there is FROM image@sha256:digest present in Dockerfile + // if matched it returns digest + // if not, it returns null + + try { + if (!dockerFileContent || dockerFileContent == "") { + return null; + } + + var lines = dockerFileContent.split(/[\r?\n]/); + var aliasToImageNameMapping: Map = new Map(); + var baseImage = ""; + + for (var i = 0; i < lines.length; i++) { + const currentLine = lines[i].trim(); + if (!currentLine.toUpperCase().startsWith("FROM")) { + continue; + } + var nameComponents = currentLine.substring(4).toLowerCase().split(" as "); + var prospectImageName = nameComponents[0].trim(); + + if (nameComponents.length > 1) { + var alias = nameComponents[1].trim(); + + if (aliasToImageNameMapping.has(prospectImageName)) { + aliasToImageNameMapping.set(alias, aliasToImageNameMapping.get(prospectImageName)); + } else { + aliasToImageNameMapping.set(alias, prospectImageName); + } + + baseImage = aliasToImageNameMapping.get(alias); + } else { + baseImage = aliasToImageNameMapping.has(prospectImageName) + ? aliasToImageNameMapping.get(prospectImageName) + : prospectImageName; + } + } + + return baseImage.split('@')[1].split(':')[1]; + } catch (error) { + tl.debug(`An error ocurred getting the base image digest. ${error.message}`); + return null; + } +} diff --git a/common-npm-packages/docker-common/pipelineutils.ts b/common-npm-packages/docker-common/pipelineutils.ts index c9e8132b..8e3efeff 100644 --- a/common-npm-packages/docker-common/pipelineutils.ts +++ b/common-npm-packages/docker-common/pipelineutils.ts @@ -66,10 +66,17 @@ function addBaseImageLabels(connection: ContainerConnection, labels: string[], d return; } - const baseImageDigest = containerUtils.getImageDigest(connection, baseImageName); + var baseImageDigest = containerUtils.getBaseImageDigestDockerFile(dockerFilePath); + + //first check if there is digest passed in Dockerfile + if (!baseImageDigest) { + baseImageDigest = containerUtils.getImageDigest(connection, baseImageName); + } + + //if not there is no digest in Dockerfile, get digest using ImageName:tag if (baseImageDigest) { addLabelWithValue("image.base.digest", baseImageDigest, labels); - } + } } function getReverseDNSName(): string { @@ -115,4 +122,4 @@ export function getDefaultLabels(addPipelineData?: boolean, addBaseImageData?: b } } return labels; -} \ No newline at end of file +}