Example #1
0
 public static Task <string> EnsureContainerIsRunning(
     DockerClient client,
     IEnsureContainerIsRunningContext context,
     CancellationToken token)
 {
     return(EnsureContainerIsRunningInternal(client, context, token));
 }
Example #2
0
        private static async Task <string> EnsureContainerIsRunningInternal(
            DockerClient client,
            IEnsureContainerIsRunningContext context,
            CancellationToken token)
        {
            string id = null;

            async Task <bool> IsContainerRunning(string identity)
            {
                var d = await client.Containers.InspectContainerAsync(identity, token);

                return(d.State.Running);
            }

            async Task <ContainerListResponse> GetContainer()
            {
                var containers = await client.Containers.ListContainersAsync(
                    new ContainersListParameters()
                {
                    All = true,
                }, token);

                return(context.GetContainer(containers));
            }

            var listContainer = await GetContainer();

            if (listContainer != null && await IsContainerRunning(listContainer.ID))
            {
                return(listContainer.ID);
            }

            if (listContainer != null)
            {
                id = listContainer.ID;
            }
            else
            {
                do
                {
                    if (listContainer == null)
                    {
                        try
                        {
                            var createImageParams = context.CreateImage(new ImagesCreateParameters());
                            await client.Images.CreateImageAsync(
                                createImageParams,
                                new AuthConfig()
                            {
                                ServerAddress = "hub.docker.com",
                            },
                                new Progress <JSONMessage>(),
                                token
                                );

                            var createParams = context.CreateContainer(new CreateContainerParameters());
                            var container    = await client.Containers.CreateContainerAsync(createParams, token);

                            id = container.ID;
                        }
                        catch
                        {
                            listContainer = await GetContainer();
                        }
                    }

                    id = listContainer?.ID;
                    token.ThrowIfCancellationRequested();
                } while (string.IsNullOrEmpty(id));
            }

            if (!await IsContainerRunning(id))
            {
                await client.Containers.StartContainerAsync(id,
                                                            context.StartContainer(new ContainerStartParameters()), token);
            }

            return(id);
        }