run method
Future<DockerRunner>
run(
- String image, {
- String? version,
- List<
String> ? imageArgs, - String? containerName,
- List<
String> ? ports, - String? network,
- String? hostname,
- Map<
String, String> ? environment, - Map<
String, String> ? volumes, - bool cleanContainer = true,
- String? healthCmd,
- Duration? healthInterval,
- int? healthRetries,
- Duration? healthStartPeriod,
- Duration? healthTimeout,
- String? restart,
- DockerRunOptions? options,
- bool? outputAsLines = true,
- int? outputLimit,
- OutputReadyFunction? stdoutReadyFunction,
- OutputReadyFunction? stderrReadyFunction,
- OutputReadyType? outputReadyType,
override
Runs a Docker containers with image and optional version.
options are merged over the other named parameters.
Implementation
@override
Future<DockerRunner> run(
String image, {
String? version,
List<String>? imageArgs,
String? containerName,
List<String>? ports,
String? network,
String? hostname,
Map<String, String>? environment,
Map<String, String>? volumes,
bool cleanContainer = true,
String? healthCmd,
Duration? healthInterval,
int? healthRetries,
Duration? healthStartPeriod,
Duration? healthTimeout,
String? restart,
DockerRunOptions? options,
bool? outputAsLines = true,
int? outputLimit,
OutputReadyFunction? stdoutReadyFunction,
OutputReadyFunction? stderrReadyFunction,
OutputReadyType? outputReadyType,
}) async {
outputAsLines ??= true;
outputReadyType ??= DockerHost.resolveOutputReadyType(
stdoutReadyFunction, stderrReadyFunction);
stdoutReadyFunction ??= (outputStream, data) => true;
stderrReadyFunction ??= (outputStream, data) => true;
var instanceID = DockerProcess.incrementInstanceID();
var runOptions = DockerHost.resolveRunOptions(
ports: ports,
network: network,
hostname: hostname,
environment: environment,
volumes: volumes,
cleanContainer: cleanContainer,
healthCmd: healthCmd,
healthInterval: healthInterval,
healthRetries: healthRetries,
healthStartPeriod: healthStartPeriod,
healthTimeout: healthTimeout,
restart: restart,
options: options,
);
if (runOptions.reuse ?? false) {
// Computed before the session label, so other sessions match it:
var configHash = computeConfigHash(
image, version, containerName, imageArgs, runOptions);
runOptions = runOptions.merge(DockerRunOptions(
labels: {DockerRunOptions.labelConfigHash: configHash}));
var running = await DockerCMD.listContainersByLabel(
this, {DockerRunOptions.labelConfigHash: configHash},
all: false);
if (running != null && running.isNotEmpty) {
return _attachRunner(
instanceID,
running.first,
DockerHost.resolveImage(image, version),
runOptions,
outputAsLines,
outputLimit,
stdoutReadyFunction,
stderrReadyFunction,
outputReadyType);
}
}
runOptions = defaultRunOptions.merge(runOptions);
if (isEmptyString(containerName, trim: true)) {
containerName = 'docker_commander-$session-$instanceID';
}
var containerInfos = buildContainerArgsWithOptions(
'run',
image,
version,
containerName!,
runOptions,
addCIDFile: true,
);
var cmdArgs = containerInfos.args!;
if (imageArgs != null) {
cmdArgs.addAll(imageArgs);
}
_log.info('run[CMD]>\t$dockerBinaryPath ${cmdArgs.join(' ')}');
var process = await Process.start(dockerBinaryPath!, cmdArgs);
var containerNetwork = containerInfos.containerNetwork;
var runner = DockerRunnerLocal(
this,
instanceID,
containerInfos.containerName,
containerInfos.image,
process,
containerInfos.idFile,
containerInfos.ports,
containerNetwork,
containerInfos.containerHostname,
outputAsLines,
outputLimit,
stdoutReadyFunction,
stderrReadyFunction,
outputReadyType);
_runners[instanceID] = runner;
_processes[instanceID] = runner;
var ok = await _initializeAndWaitReady(runner, () async {
if (containerNetwork != null) {
await _configureContainerNetwork(containerNetwork, runner);
}
});
if (ok) {
if (runOptions.hasEphemeralPorts) {
await runner.resolvePorts();
}
_log.info('Runner[$ok]: $runner');
}
return runner;
}