up method
Implementation
Future<ComposeEnvironmentInstance> up() async {
final projectId = 'datahub_test_${uuid()}';
final parsedCompose = loadYaml(compose) as Map;
final services = parsedCompose['services'] as Map;
final servicePorts = <(String, int)>[];
for (final (serviceName, service) in services.tuples) {
final ports = service['ports'] as List?;
for (final port in ports ?? const []) {
final parts = port.toString().split(':');
final containerPort = switch (parts.length) {
1 => int.parse(parts[0]),
_ => int.parse(parts[1]),
};
servicePorts.add((serviceName, containerPort));
}
}
final process = await io.Process.start('docker', [
'compose',
'-p',
projectId,
'-f',
'-',
'up',
'-d',
if (servicePorts.isNotEmpty) '--wait',
...servicePorts.$1,
]);
process.stdin.write(compose);
await process.stdin.close();
if (await process.exitCode != 0) {
throw StateError(
'docker compose up failed:\n${await utf8.decodeStream(process.stderr)}',
);
}
return ComposeEnvironmentInstance(
composeEnvironment: this,
projectId: projectId,
servicePorts: [
for (final servicePort in servicePorts)
ServicePort(
name: servicePort.$1,
containerPort: servicePort.$2,
hostPort: await findPort(projectId, servicePort.$1, servicePort.$2),
),
],
);
}