mirror of
https://github.com/balena-io/balena-cli.git
synced 2025-05-02 09:03:05 +00:00
Add support for docker-compose dev overlay in local pushes
Change-type: minor Signed-off-by: Scott Lowe <scott@balena.io>
This commit is contained in:
parent
a701cd8d4d
commit
f3d750a024
1
lib/utils/compose-types.d.ts
vendored
1
lib/utils/compose-types.d.ts
vendored
@ -55,6 +55,7 @@ export interface ComposeOpts {
|
|||||||
noParentCheck: boolean;
|
noParentCheck: boolean;
|
||||||
projectName: string;
|
projectName: string;
|
||||||
projectPath: string;
|
projectPath: string;
|
||||||
|
isLocal?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ComposeCliFlags {
|
export interface ComposeCliFlags {
|
||||||
|
@ -136,6 +136,7 @@ export async function loadProject(
|
|||||||
} else {
|
} else {
|
||||||
logger.logDebug('Resolving project...');
|
logger.logDebug('Resolving project...');
|
||||||
[composeName, composeStr] = await resolveProject(logger, opts.projectPath);
|
[composeName, composeStr] = await resolveProject(logger, opts.projectPath);
|
||||||
|
|
||||||
if (composeName) {
|
if (composeName) {
|
||||||
if (opts.dockerfilePath) {
|
if (opts.dockerfilePath) {
|
||||||
logger.logWarn(
|
logger.logWarn(
|
||||||
@ -148,11 +149,52 @@ export async function loadProject(
|
|||||||
);
|
);
|
||||||
composeStr = compose.defaultComposition(undefined, opts.dockerfilePath);
|
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...');
|
logger.logDebug('Creating project...');
|
||||||
return createProject(opts.projectPath, composeStr, opts.projectName);
|
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
|
* Look into the given directory for valid compose files and return
|
||||||
* the contents of the first one found.
|
* the contents of the first one found.
|
||||||
@ -181,6 +223,7 @@ async function resolveProject(
|
|||||||
if (!quiet && !composeFileName) {
|
if (!quiet && !composeFileName) {
|
||||||
logger.logInfo(`No "docker-compose.yml" file found at "${projectRoot}"`);
|
logger.logInfo(`No "docker-compose.yml" file found at "${projectRoot}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return [composeFileName, composeFileContents];
|
return [composeFileName, composeFileContents];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,6 +186,7 @@ export async function deployToDevice(opts: DeviceDeployOptions): Promise<void> {
|
|||||||
noParentCheck: opts.noParentCheck,
|
noParentCheck: opts.noParentCheck,
|
||||||
projectName: 'local',
|
projectName: 'local',
|
||||||
projectPath: opts.source,
|
projectPath: opts.source,
|
||||||
|
isLocal: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Attempt to attach to the device's docker daemon
|
// Attempt to attach to the device's docker daemon
|
||||||
|
Loading…
x
Reference in New Issue
Block a user