dockerfile-ast
Version:
Parse a Dockerfile into an array of instructions and comments.
54 lines (53 loc) • 2.13 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.Workdir = void 0;
const instruction_1 = require("../instruction");
class Workdir extends instruction_1.Instruction {
constructor(document, range, dockerfile, escapeChar, instruction, instructionRange) {
super(document, range, dockerfile, escapeChar, instruction, instructionRange);
}
/**
* Returns the path that has been defined. Note that this path may
* be absolute or relative depending on what was written in the
* instruction.
*
* @return the working directory's path, or null if this
* instruction has no arguments
*/
getPath() {
return this.getArgumentsContent();
}
/**
* Returns the absolute path that this instruction resolves to. The
* function will inspect prior WORKDIR instructions in the current
* image or another build stage in the Dockerfile to try to
* determine this.
*
* @return the absolute path of the working directory, or null if
* this instruction has no arguments, or undefined if it
* cannot be determined because only relative paths could be
* found
*/
getAbsolutePath() {
const path = this.getPath();
if (path === null || path.startsWith("/")) {
return path;
}
const startLine = this.getRange().start.line;
const hierarchy = this.dockerfile.getStageHierarchy(startLine);
for (let i = hierarchy.length - 1; i >= 0; i--) {
const workdirs = hierarchy[i].getWORKDIRs();
for (let j = workdirs.length - 1; j >= 0; j--) {
if (workdirs[j].getRange().start.line < startLine) {
const parent = workdirs[j].getAbsolutePath();
if (parent === undefined || parent === null) {
return undefined;
}
return parent.endsWith("/") ? parent + path : parent + "/" + path;
}
}
}
return undefined;
}
}
exports.Workdir = Workdir;
;