run method

  1. @override
Future<DockerRunner?> run(
  1. String image, {
  2. String? version,
  3. List<String>? imageArgs,
  4. String? containerName,
  5. List<String>? ports,
  6. String? network,
  7. String? hostname,
  8. Map<String, String>? environment,
  9. Map<String, String>? volumes,
  10. bool cleanContainer = true,
  11. String? healthCmd,
  12. Duration? healthInterval,
  13. int? healthRetries,
  14. Duration? healthStartPeriod,
  15. Duration? healthTimeout,
  16. String? restart,
  17. bool outputAsLines = true,
  18. int? outputLimit,
  19. OutputReadyFunction? stdoutReadyFunction,
  20. OutputReadyFunction? stderrReadyFunction,
  21. OutputReadyType? outputReadyType,
})
override

Runs a Docker containers with image and optional version.

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,
  bool outputAsLines = true,
  int? outputLimit,
  OutputReadyFunction? stdoutReadyFunction,
  OutputReadyFunction? stderrReadyFunction,
  OutputReadyType? outputReadyType,
}) async {
  ports = DockerHost.normalizeMappedPorts(ports);

  var imageArgsEncoded = (imageArgs != null && imageArgs.isNotEmpty)
      ? encodeJSON(imageArgs)
      : null;

  var response = await _httpClient.getJSON('run', parameters: {
    'image': image,
    if (version != null) 'version': version,
    if (imageArgsEncoded != null) 'imageArgs': imageArgsEncoded,
    if (containerName != null) 'name': containerName,
    if (ports != null) 'ports': ports.join(','),
    if (network != null) 'network': network,
    if (hostname != null) 'hostname': hostname,
    if (environment != null) 'environment': encodeQueryString(environment),
    if (volumes != null) 'volumes': encodeQueryString(volumes),
    'cleanContainer': '$cleanContainer',
    if (healthCmd != null) 'healthCmd': healthCmd,
    if (healthInterval != null)
      'healthInterval': '${healthInterval.inMilliseconds}',
    if (healthRetries != null) 'healthRetries': '$healthRetries',
    if (healthStartPeriod != null)
      'healthStartPeriod': '${healthStartPeriod.inMilliseconds}',
    if (healthTimeout != null)
      'healthTimeout': '${healthTimeout.inMilliseconds}',
    if (restart != null) 'restart': restart,
    'outputAsLines': '$outputAsLines',
    'outputLimit': '$outputLimit',
  }) as Map?;

  if (response == null) return null;

  var instanceID = response['instanceID'] as int;
  containerName = response['containerName'] as String?;
  var id = response['id'] as String?;

  outputReadyType ??= DockerHost.resolveOutputReadyType(
      stdoutReadyFunction, stderrReadyFunction);

  stdoutReadyFunction ??= (outputStream, data) => true;
  stderrReadyFunction ??= (outputStream, data) => true;

  var imageResolved = DockerHost.resolveImage(image, version);

  var runner = DockerRunnerRemote(
      this,
      instanceID,
      containerName!,
      imageResolved,
      ports,
      outputLimit,
      outputAsLines,
      stdoutReadyFunction,
      stderrReadyFunction,
      outputReadyType,
      id);

  _runners[instanceID] = runner;

  var ok = await _initializeAndWaitReady(runner);

  if (ok) {
    _log.info('Runner[$ok]: $runner');
  }

  return runner;
}