private async Task <ContainerListResponse> CreateContainer(ContainerParameters containerParameters, CancellationToken cancellationToken)
        {
            // Create new container
            var createParams = GetCreateContainerParameters(containerParameters);

            var containerInstance = await _dockerClient.Containers.CreateContainerAsync(createParams, cancellationToken);

            // Run container
            await _dockerClient.Containers.StartContainerAsync(containerInstance.ID, new ContainerStartParameters(), cancellationToken);

            // Try to find container in docker session
#pragma warning disable CS8603 // Possible null reference return.
            return(await GetContainerAsync(containerParameters.Name, cancellationToken));

#pragma warning restore CS8603 // Possible null reference return.
        }
        private CreateContainerParameters GetCreateContainerParameters(ContainerParameters containerParameters)
        {
            var(name, imageName, tag, environmentVariables, ports, entrypoint, exposedPorts) =
                (containerParameters.Name, containerParameters.ImageName, containerParameters.Tag, containerParameters.EnvironmentVariables, containerParameters.Ports, containerParameters.Entrypoint, containerParameters.ExposedPorts);

            var stringifiedVariables = environmentVariables?.Select(p => $"{p.Key}={p.Value}")?.ToArray()
                                       ?? Array.Empty <string>();

            var createParams = new CreateContainerParameters
            {
                Name         = name,
                Image        = $"{imageName}:{tag}",
                AttachStdout = true,
                Env          = stringifiedVariables,
                Hostname     = name,
                HostConfig   = new HostConfig
                {
                    PublishAllPorts = ports == null
                }
            };

            if (ports is not null)
            {
                createParams.HostConfig.PortBindings = ports
                                                       .ToDictionary(
                    p => $"{p.Key}/tcp",
                    p => (IList <PortBinding>) new List <PortBinding>
                {
                    new PortBinding {
                        HostPort = p.Value.ToString()
                    }
                });
            }

            if (entrypoint is not null && entrypoint.Any())
            {
                createParams.Entrypoint = entrypoint;
            }

            if (exposedPorts is not null && exposedPorts.Any())
            {
                createParams.ExposedPorts = exposedPorts.ToDictionary(p => $"{p}/tcp", p => default(EmptyStruct));
            }

            return(createParams);
        }
        public async Task <ContainerRuntimeInfo> RunContainerAsync(ContainerParameters containerParameters, CancellationToken cancellationToken = default)
        {
            var(name, reusable) = (containerParameters.Name, containerParameters.Reusable);

            // Try to find container in docker session
            var startedContainer = await GetContainerAsync(name, cancellationToken);

            // If container already exist - remove that
            if (startedContainer != null)
            {
                // TODO: check status and network
                if (!reusable)
                {
                    await _dockerClient.Containers.RemoveContainerAsync(
                        startedContainer.ID,
                        new ContainerRemoveParameters { Force = true },
                        cancellationToken);

                    startedContainer = await CreateContainer(containerParameters, cancellationToken);
                }
            }
            else
            {
                startedContainer = await CreateContainer(containerParameters, cancellationToken);
            }

            _logger?.LogInformation($"Container '{name}' has been run.");
            _logger?.LogDebug($"Container state: {startedContainer.State}");
            _logger?.LogDebug($"Container status: {startedContainer.Status}");
            _logger?.LogDebug(
                $"Container IPAddress: {startedContainer.NetworkSettings.Networks.FirstOrDefault().Key} - {startedContainer.NetworkSettings.Networks.FirstOrDefault().Value.IPAddress}");

            var ipAddress = startedContainer.NetworkSettings.Networks.FirstOrDefault().Value.IPAddress;
            var ports     = startedContainer.Ports.DistinctBy(p => p.PrivatePort).ToDictionary(p => p.PrivatePort, p => p.PublicPort);

            return(new(startedContainer.ID, ipAddress, ports));
        }
Exemplo n.º 4
0
 public MetricsServer(ContainerParameters parameters)
 {
     Parameters = parameters;
 }
 public ElasticsearchContainer(ContainerParameters containerParameters, IContainerApi containerApi, ImageApi imageApi, ILogger?logger)
     : base(containerParameters, containerApi, imageApi, logger)
 {
 }
 public ElasticsearchContainer(ContainerParameters containerParameters, IDockerClient dockerClient, ILogger?logger)
     : base(containerParameters, dockerClient, logger)
 {
 }
 public ElasticsearchContainer(ContainerParameters containerParameters, IDockerClient dockerClient)
     : base(containerParameters, dockerClient)
 {
 }
 public ElasticsearchContainer(ContainerParameters containerParameters)
     : base(containerParameters)
 {
 }
 public KafkaContainer(ContainerParameters containerParameters, IContainerApi containerApi, ImageApi imageApi, ILogger?logger)
     : base(containerParameters, containerApi, imageApi, logger)
 {
 }
 public KafkaContainer(ContainerParameters containerParameters, IDockerClient dockerClient, ILogger?logger)
     : base(containerParameters, dockerClient, logger)
 {
 }
 public KafkaContainer(ContainerParameters containerParameters, IDockerClient dockerClient)
     : base(containerParameters, dockerClient)
 {
 }
 public KafkaContainer(ContainerParameters containerParameters)
     : base(containerParameters)
 {
 }
Exemplo n.º 13
0
 public JSonKafkaBus(ILogger <JSonKafkaBus> logger, ContainerParameters parameters)
 {
     _parameters = parameters;
     _logger     = logger;
 }
Exemplo n.º 14
0
 public DataContext(IMetricsServer metrics, ContainerParameters parameters)
 {
     this._metrics = metrics;
     Parameters    = parameters;
 }