Skip to content

Commit

Permalink
Add support for docker-compose dev overlay in local pushes
Browse files Browse the repository at this point in the history
Change-type: minor
Signed-off-by: Scott Lowe <[email protected]>
  • Loading branch information
srlowe committed Feb 9, 2021
1 parent a701cd8 commit f3d750a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/utils/compose-types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export interface ComposeOpts {
noParentCheck: boolean;
projectName: string;
projectPath: string;
isLocal?: boolean;
}

export interface ComposeCliFlags {
Expand Down
43 changes: 43 additions & 0 deletions lib/utils/compose_ts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ export async function loadProject(
} else {
logger.logDebug('Resolving project...');
[composeName, composeStr] = await resolveProject(logger, opts.projectPath);

if (composeName) {
if (opts.dockerfilePath) {
logger.logWarn(
Expand All @@ -148,11 +149,52 @@ export async function loadProject(
);
composeStr = compose.defaultComposition(undefined, opts.dockerfilePath);
}

// If local push, merge dev compose overlay
if (opts.isLocal) {
composeStr = await mergeDevComposeOverlay(
logger,
composeStr,
opts.projectPath,
);
}
}
logger.logDebug('Creating project...');
return createProject(opts.projectPath, composeStr, opts.projectName);
}

/**
* Check for existence of docker-compose dev overlay file
* and merge in services definitions.
*/
async function mergeDevComposeOverlay(
logger: Logger,
composeStr: string,
projectRoot: string,
) {
const devOverlayFilename = 'docker-compose.dev.yml';
const devOverlayPath = path.join(projectRoot, devOverlayFilename);

if (await exists(devOverlayPath)) {
logger.logInfo(
`Docker compose dev overlay detected (${devOverlayFilename}) - merging.`,
);
try {
const yaml = await import('js-yaml');
const compose = yaml.load(composeStr);
const devOverlay = yaml.load(await fs.readFile(devOverlayPath, 'utf8'));
// We only want to merge the services section
compose.services = { ...compose.services, ...devOverlay.services };
composeStr = yaml.dump(compose);
} catch (err) {
err.message = `Error merging docker compose dev overlay file "${devOverlayPath}":\n${err.message}`;
throw err;
}
}

return composeStr;
}

/**
* Look into the given directory for valid compose files and return
* the contents of the first one found.
Expand Down Expand Up @@ -181,6 +223,7 @@ async function resolveProject(
if (!quiet && !composeFileName) {
logger.logInfo(`No "docker-compose.yml" file found at "${projectRoot}"`);
}

return [composeFileName, composeFileContents];
}

Expand Down
1 change: 1 addition & 0 deletions lib/utils/device/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ export async function deployToDevice(opts: DeviceDeployOptions): Promise<void> {
noParentCheck: opts.noParentCheck,
projectName: 'local',
projectPath: opts.source,
isLocal: true,
});

// Attempt to attach to the device's docker daemon
Expand Down

0 comments on commit f3d750a

Please sign in to comment.