navy
Version:
Quick and powerful development environments using Docker and Docker Compose
86 lines (69 loc) • 2.81 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createComposeClient = createComposeClient;
var _path = _interopRequireDefault(require("path"));
var _invariant = _interopRequireDefault(require("invariant"));
var _fs = _interopRequireDefault(require("../../util/fs"));
var _execAsync = require("../../util/exec-async");
var _driverLogging = require("../../driver-logging");
var _state = require("../../navy/state");
function createComposeClient(navy) {
const client = {
async exec(command, args = [], opts = {}) {
const composeArgs = ['-p', navy.normalisedName];
const {
useOriginalDockerComposeFiles,
noLog,
pipeLog,
maxBuffer
} = opts;
const composeOpts = {
maxBuffer: maxBuffer || Infinity
};
const composeFilePath = await client.getDockerComposeFilePath();
if (composeFilePath && !useOriginalDockerComposeFiles) {
composeArgs.push('-f', composeFilePath);
} else {
composeOpts.cwd = await client.getOriginalDockerComposeDirectory();
}
composeArgs.push(command, ...args);
try {
return await (0, _execAsync.execAsync)('docker compose', composeArgs, childProcess => {
if (!noLog && !pipeLog) {
childProcess.stdout.on('data', data => (0, _driverLogging.log)(data));
childProcess.stderr.on('data', data => (0, _driverLogging.log)(data));
} else if (pipeLog) {
childProcess.stdout.on('data', data => process.stdout.write(data));
childProcess.stderr.on('data', data => process.stderr.write(data));
}
}, composeOpts);
} catch (ex) {
if (ex.message && ex.message.indexOf('Can\'t find a suitable configuration file') !== -1) {
(0, _invariant.default)(false, "NO_DOCKER_COMPOSE_FILE: No docker-compose.yml (or valid Docker Compose config) found");
}
throw ex;
}
},
getCompiledDockerComposePath() {
return _path.default.join((0, _state.pathToNavy)(navy.normalisedName), 'docker-compose.tmp.yml');
},
async getOriginalDockerComposeDirectory() {
const configProvider = await navy.getConfigProvider();
(0, _invariant.default)(configProvider, "NO_CONFIG_PROVIDER: Couldn't determine config provider for navy %s", navy.name);
return configProvider.getNavyPath();
},
async getDockerComposeFilePath() {
try {
const compiledComposePath = await client.getCompiledDockerComposePath();
await _fs.default.statAsync(compiledComposePath);
return compiledComposePath;
} catch (ex) {
return null;
}
}
};
return client;
}