public static Task <string> EnsureContainerIsRunning( DockerClient client, IEnsureContainerIsRunningContext context, CancellationToken token) { return(EnsureContainerIsRunningInternal(client, context, token)); }
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); }