static void CopyDirectoryFromContainer(DockerClient client, String ContainerId, String DirToCopy) { var container = CheckContainerExists(client, ContainerId); if (container == null) { Console.WriteLine("Container doesn't exist"); } else { GetArchiveFromContainerParameters ArchiveParameters = new GetArchiveFromContainerParameters { Path = DirToCopy }; try { var TaskResult = client.Containers.GetArchiveFromContainerAsync(container.ID, ArchiveParameters, false); var data = TaskResult.Result.Stream; MemoryStream ms = new MemoryStream(); data.CopyTo(ms); ms.Dispose(); var DestFilename = Path.GetFileName(DirToCopy) + ".tar"; Console.WriteLine("Writing: " + DestFilename); File.WriteAllBytes(DestFilename, ms.ToArray()); } catch (Exception e) { Console.WriteLine("Error when retrieving files: " + e.Message); } } }
protected override async Task ProcessRecordAsync() { if (Container != null) { Id = Container.ID; } if (ToContainer.ToBool()) { var hostPaths = Path.SelectMany(path => { ProviderInfo provider; var resolvedPaths = SessionState.Path.GetResolvedProviderPathFromPSPath(path, out provider); if (provider.Name != "FileSystem") { throw new Exception(string.Format("The path {0} is not in the file system.", path)); } return(resolvedPaths); }).ToList(); var p = new ContainerPathStatParameters { Path = Destination ?? "." }; var progress = new Progress <string>(); progress.ProgressChanged += (o, s) => WriteVerbose(string.Format("Sending {0}", s)); using (var reader = Archiver.CreateTarStream(hostPaths, CmdletCancellationToken, progress)) { await DkrClient.Containers.ExtractArchiveToContainerAsync(Id, p, reader, CmdletCancellationToken); } } else { var hostPath = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, Destination ?? ""); foreach (var singlePath in Path) { var p = new GetArchiveFromContainerParameters { Path = singlePath }; var response = await DkrClient.Containers.GetArchiveFromContainerAsync(Id, p, false, CmdletCancellationToken); using (var stream = response.Stream) { var progress = new Progress <string>(); progress.ProgressChanged += (o, s) => WriteVerbose(string.Format("Extracting {0}", s)); var tarReader = new TarReader(stream); await tarReader.ExtractDirectoryAsync(hostPath, CmdletCancellationToken, progress); } } } }
public async Task <GetArchiveFromContainerResponse> GetArchiveFromContainerAsync(string id, GetArchiveFromContainerParameters parameters, bool statOnly, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(id)) { throw new ArgumentNullException(nameof(id)); } if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } IQueryString queryParameters = new QueryString <GetArchiveFromContainerParameters>(parameters); var response = await this._client.MakeRequestForStreamedResponseAsync(new[] { NoSuchContainerHandler }, statOnly?HttpMethod.Head : HttpMethod.Get, $"containers/{id}/archive", queryParameters, null, cancellationToken); var statHeader = response.Headers.GetValues("X-Docker-Container-Path-Stat").First(); var bytes = Convert.FromBase64String(statHeader); var stat = Encoding.UTF8.GetString(bytes, 0, bytes.Length); var pathStat = this._client.JsonSerializer.DeserializeObject <ContainerPathStatResponse>(stat); return(new GetArchiveFromContainerResponse { Stat = pathStat, Stream = statOnly ? null : response.Body }); }