import * as fs from 'fs'; import * as path from 'path'; import { createError, shellExec } from '@cirrusct/core-node'; import { Logger } from '@cirrusct/logging'; import { MonoRepoPackage, parseDotEnvFile, MonoRepo, MrConfig } from '@cirrusct/mr-core'; import { BuildConfig } from '@cirrusct/mr-build'; import { MrDockerOptions } from './types'; import { ResolvedDeploymentConfig } from '../deploy'; import { envVarsToDockerCli } from './lib'; export const shellDocker = async ( config: ResolvedDeploymentConfig, options: MrDockerOptions, mr: MonoRepo, logger: Logger ) => { try { if (!(options.composeBuild || options.composeUp)) { logger.warn(`No operation specified. Expected either 'build' or 'up'`); process.exit(1); } const operation = options.composeUp ? `up${options.composeBuild ? ' --build' : ''}` : 'build'; const composeFilePath = path.join(config.output, 'docker-compose.yml'); if (!composeFilePath) { throw createError(`docker-compose.yml not found at ${composeFilePath}`); } // this only works for docker-compose 'run'. Need to sort out how to handle env in general let envCli = null; // if (options.dotEnvPath) { // envCli = envVarsToDockerCli(mr.getEnv(options.dotEnvPath)); // } const cmdLine = `docker-compose -f "${path.relative(process.cwd(), composeFilePath)}"${ envCli ? ` ${envCli}` : '' } ${operation}`; //console.log(cmdLine); logger.info({ cmdLine }, 'Shelling to docker-compose'); const result = await shellExec(cmdLine, { ignoreErrorCode: true }); } catch (err) { logger.error({}, err.message); throw createError('shellDocker Failed', err); } };