Пример #1
0
        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)}"));
        }
Пример #2
0
        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)}"));
        }
Пример #3
0
        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);
        }