Exemple #1
0
        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);
                    }
                }
            }
        }
Exemple #3
0
        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
            });
        }