/
exec.ts
57 lines (50 loc) · 1.86 KB
/
exec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import fingerprintConfig from '../utils/fingerprint-config';
import createDebug from 'debug';
import _runInContainer from '../utils/run-in-container';
import _runDockerCompose from '../utils/run-docker-compose';
import _writeConfig from '../utils/write-config';
import { Config } from '../utils/read-config';
import Completion from '../utils/completion';
const debug = createDebug('dockerized:exec');
export interface CreateExecInput {
config: Config;
baseDir: string;
runInContainer?: typeof _runInContainer;
runDockerCompose?: typeof _runDockerCompose;
writeConfig?: typeof _writeConfig;
}
export default function createExec({
config,
baseDir,
runInContainer = _runInContainer,
runDockerCompose = _runDockerCompose,
writeConfig = _writeConfig,
}: CreateExecInput) {
return async (command: string): Promise<Completion> => {
const dockerComposeFile = config.composeFile;
const currentConfigFingerprint = fingerprintConfig(config);
const rebuildInDockerCompose = () =>
runDockerCompose({
dockerComposeArgs: ['build'],
baseDir,
dockerComposeFile,
rejectOnNonZeroExitCode: true,
});
if (currentConfigFingerprint !== config.fingerprint) {
const configWithFingerprint = Object.assign({}, config, {
fingerprint: currentConfigFingerprint,
});
debug(`config.fingerprint is outdated. running 'compose build'`);
await rebuildInDockerCompose();
debug(`updating config.fingerprint`);
writeConfig(baseDir, configWithFingerprint);
}
const completion = await runInContainer({
command,
baseDir,
dockerComposeFile,
rejectOnNonZeroExitCode: false,
});
return completion;
};
}