public DockerRunCommandProcessResult RunAndDoNotWaitForProcessExit(DockerRunArguments dockerRunArguments) { if (dockerRunArguments == null) { throw new ArgumentNullException(nameof(dockerRunArguments)); } if (string.IsNullOrEmpty(dockerRunArguments.ImageId)) { throw new ArgumentException( $"'{nameof(dockerRunArguments)}.{nameof(dockerRunArguments.ImageId)}' cannot be null or empty."); } Process process = null; Exception exception = null; var outputBuilder = new StringBuilder(); var errorBuilder = new StringBuilder(); // Generate a unique container name for each 'run' call. // Provide a prefix so that one can delete the containers using regex, if needed var containerName = $"{CreatedContainerPrefix}{Guid.NewGuid().ToString("N")}"; // Make sure not to run the container in background dockerRunArguments.RunContainerInBackground = false; var fileName = "docker"; var arguments = PrepareDockerRunArguments(containerName, dockerRunArguments); try { process = ProcessHelper.StartProcess( fileName, arguments, workingDirectory: null, // Preserve the output structure and use AppendLine as these handlers // are called for each line that is written to the output. standardOutputHandler: (sender, args) => { outputBuilder.AppendLine(args.Data); }, standardErrorHandler: (sender, args) => { errorBuilder.AppendLine(args.Data); }); } catch (InvalidOperationException invalidOperationException) { exception = invalidOperationException; } return(new DockerRunCommandProcessResult( containerName, process, exception, outputBuilder, errorBuilder, $"{fileName} {string.Join(" ", arguments)}")); }
public DockerRunCommandResult Run(DockerRunArguments dockerRunArguments) { if (dockerRunArguments == null) { throw new ArgumentNullException(nameof(dockerRunArguments)); } if (string.IsNullOrEmpty(dockerRunArguments.ImageId)) { throw new ArgumentException( $"'{nameof(dockerRunArguments)}.{nameof(dockerRunArguments.ImageId)}' cannot be null or empty."); } var output = string.Empty; var error = string.Empty; int exitCode = -1; Exception exception = null; // Generate a unique container name for each 'run' call. // Provide a prefix so that one can delete the containers using regex, if needed var containerName = $"{CreatedContainerPrefix}{Guid.NewGuid().ToString("N")}"; var fileName = "docker"; var arguments = PrepareDockerRunArguments(containerName, dockerRunArguments); try { (exitCode, output, error) = ProcessHelper.RunProcess( fileName, arguments, workingDirectory: null, _waitTimeForExit); } catch (InvalidOperationException invalidOperationException) { exception = invalidOperationException; } return(new DockerRunCommandResult( containerName, exitCode, exception, output, error, dockerRunArguments.Volumes, $"{fileName} {string.Join(" ", arguments)}")); }
private IEnumerable <string> PrepareDockerRunArguments( string containerName, DockerRunArguments dockerRunArguments) { var args = new List <string>(); args.Add("run"); args.Add("--name"); args.Add(containerName); // By default we want to remove containers that are created when running tests. var removeContainers = Environment.GetEnvironmentVariable( Settings.RemoveTestContainersEnvironmentVariableName); if (string.IsNullOrEmpty(removeContainers) || !string.Equals(removeContainers, "false", StringComparison.OrdinalIgnoreCase)) { args.Add("--rm"); } if (!string.IsNullOrWhiteSpace(dockerRunArguments.WorkingDirectory)) { args.Add("--workdir"); args.Add(dockerRunArguments.WorkingDirectory); } if (dockerRunArguments.RunContainerInBackground) { args.Add("-d"); } AddEnvVarArgs(args, _globalEnvVars); AddEnvVarArgs(args, dockerRunArguments.EnvironmentVariables); var aiKeyOverride = Environment.GetEnvironmentVariable( "TEST_OVERRIDE_" + LoggingConstants.ApplicationInsightsInstrumentationKeyEnvironmentVariableName); if (!string.IsNullOrWhiteSpace(aiKeyOverride)) { AddEnvVarArg( args, new EnvironmentVariable( LoggingConstants.ApplicationInsightsInstrumentationKeyEnvironmentVariableName, aiKeyOverride)); } var appServiceAppName = Environment.GetEnvironmentVariable(ExtVarNames.AppServiceAppNameEnvVarName); if (!string.IsNullOrWhiteSpace(appServiceAppName)) { AddEnvVarArg(args, new EnvironmentVariable(ExtVarNames.AppServiceAppNameEnvVarName, appServiceAppName)); } if (dockerRunArguments.Volumes?.Count() > 0) { foreach (var volume in dockerRunArguments.Volumes) { args.Add("-v"); args.Add($"{volume.MountedHostDir}:{volume.ContainerDir}"); } } if (!string.IsNullOrEmpty(dockerRunArguments.Link)) { args.Add("--link"); args.Add(dockerRunArguments.Link); } if (dockerRunArguments.PortInContainer.HasValue) { args.Add("-p"); args.Add(dockerRunArguments.PortInContainer.ToString()); } args.Add(dockerRunArguments.ImageId); if (!string.IsNullOrEmpty(dockerRunArguments.CommandToExecuteOnRun)) { args.Add(dockerRunArguments.CommandToExecuteOnRun); } if (dockerRunArguments.CommandArguments?.Length > 0) { args.AddRange(dockerRunArguments.CommandArguments); } return(args); }