Skip to content

Commit 0f5695c

Browse files
authored
changes to read from image for Dockerfile (#443)
* changes to read from image for Dockerfile * fixed review comments * refactored split code * review comment fixes * space fix * reverted back to its previous commit * reverted back
1 parent 2756f5f commit 0f5695c

File tree

5 files changed

+72
-6
lines changed

5 files changed

+72
-6
lines changed

common-npm-packages/docker-common/containerimageutils.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,3 +253,60 @@ export function getImageIdFromBuildOutput(output: string): string {
253253

254254
return "";
255255
}
256+
export function getBaseImageDigestDockerFile(dockerFileContentPath: string): string {
257+
// This method checks if there is FROM image@sha256:digest present in Dockerfile
258+
// if matched it returns digest
259+
// if not, it returns null
260+
261+
try {
262+
var dockerFileContent=fs.readFileSync(dockerFileContentPath).toString();
263+
if (!dockerFileContent || dockerFileContent == "") {
264+
return null;
265+
}
266+
var lines = dockerFileContent.split(/[\r?\n]/);
267+
var aliasToImageNameMapping: Map<string, string> = new Map<string, string>();
268+
var baseImage = "";
269+
270+
// Added regex pattern to check line starts with FROM IMAGE
271+
const matchPatternForDockerImage = new RegExp(/^FROM\s+IMAGE/);
272+
273+
for (var i = 0; i < lines.length; i++) {
274+
const currentLine = lines[i].trim();
275+
276+
if (!currentLine.toUpperCase().match(matchPatternForDockerImage)) {
277+
continue;
278+
}
279+
var nameComponents = currentLine.substring(4).toLowerCase().split(" as ");
280+
var prospectImageName = nameComponents[0].trim();
281+
282+
if (nameComponents.length > 1) {
283+
var alias = nameComponents[1].trim();
284+
285+
if (aliasToImageNameMapping.has(prospectImageName)) {
286+
aliasToImageNameMapping.set(alias, aliasToImageNameMapping.get(prospectImageName));
287+
} else {
288+
aliasToImageNameMapping.set(alias, prospectImageName);
289+
}
290+
291+
baseImage = aliasToImageNameMapping.get(alias);
292+
} else {
293+
baseImage = aliasToImageNameMapping.has(prospectImageName)
294+
? aliasToImageNameMapping.get(prospectImageName)
295+
: prospectImageName;
296+
}
297+
}
298+
299+
let baseImageData = baseImage.split('@');
300+
if (baseImageData.length > 1) {
301+
let digest = baseImageData[1].split(':');
302+
if (digest.length > 1){
303+
return digest[1];
304+
}
305+
}
306+
307+
return null;
308+
} catch (error) {
309+
tl.debug(`An error ocurred getting the base image digest. ${error.message}`);
310+
return null;
311+
}
312+
}

common-npm-packages/docker-common/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common-npm-packages/docker-common/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "azure-pipelines-tasks-docker-common",
3-
"version": "2.247.0",
3+
"version": "2.254.0",
44
"description": "Common Library for Azure Rest Calls",
55
"repository": {
66
"type": "git",

common-npm-packages/docker-common/pipelineutils.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,20 @@ function addBaseImageLabels(connection: ContainerConnection, labels: string[], d
6565
tl.debug("Image digest couldn't be extracted because no connection was found.");
6666
return;
6767
}
68+
let digestImageFromFileEnabled = tl.getPipelineFeature('UseDigestImageFromFile');
69+
var baseImageDigest = "";
70+
if (digestImageFromFileEnabled) {
71+
baseImageDigest = containerUtils.getBaseImageDigestDockerFile(dockerFilePath);
72+
}
73+
//first check if there is digest passed in Dockerfile
74+
if (!baseImageDigest) {
75+
baseImageDigest = containerUtils.getImageDigest(connection, baseImageName);
76+
}
6877

69-
const baseImageDigest = containerUtils.getImageDigest(connection, baseImageName);
78+
//if there is no digest in Dockerfile, get digest using ImageName:tag
7079
if (baseImageDigest) {
7180
addLabelWithValue("image.base.digest", baseImageDigest, labels);
72-
}
81+
}
7382
}
7483

7584
function getReverseDNSName(): string {

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)