Ejemplo n.º 1
0
        private void AddLayerToConfigAndManifest(BuilderLayer layer, ManifestV2 manifest, ImageV1 image)
        {
            image.rootfs.diff_ids.Add(layer.DiffId);
            image.history.Add(ImageV1History.Create(layer.Description, null));

            var(imageBytes, imageDigest) = ToJson(image);

            manifest.config.digest = imageDigest;
            manifest.config.size   = imageBytes.Length;
            manifest.layers.Add(new ManifestV2Layer
            {
                digest = layer.Digest,
                size   = layer.Size,
            });
        }
Ejemplo n.º 2
0
        private BuilderLayer CreateLayer(IEnumerable <string> adds, IEnumerable <string> addFolders, string layerName)
        {
            var description = new StringBuilder();

            EnsureTempFolder();
            var archive = new Archive(Path.Combine(_tempFolderPath, $"{layerName}.tar.gz"), true, new[] { _tempFolderPath }, _logger);

            foreach (var a in adds)
            {
                var arg = AddArgument.Parse(a, false);
                _logger.LogDebug($"--add {arg.Source} {arg.Dest} {arg.OwnerId} {arg.GroupId} {arg.Mode.AsOctalString()}");

                description.Append($"--add . {arg.Dest} {arg.OwnerId} {arg.GroupId} {arg.Mode.AsOctalString()} ");
                archive.CreateEntries(arg.Source, arg.Dest, arg.OwnerId, arg.GroupId, arg.Mode);
            }

            foreach (var a in addFolders ?? Enumerable.Empty <string>())
            {
                var arg = AddArgument.Parse(a, true);
                _logger.LogDebug($"--addFolder {arg.Dest} {arg.OwnerId} {arg.GroupId} {arg.Mode.AsOctalString()}");

                description.Append($"--addFolder {arg.Dest} {arg.OwnerId} {arg.GroupId} {arg.Mode.AsOctalString()} ");
                archive.CreateFolderEntry(arg.Dest, arg.OwnerId, arg.GroupId, arg.Mode);
            }

            var(digest, diffId) = archive.WriteFileAndCalcDigests();
            var layer = new BuilderLayer
            {
                Name        = layerName,
                Digest      = digest,
                DiffId      = diffId,
                Size        = archive.GetSize(),
                Description = description.ToString(),
            };

            var layerLogger = CreateLogger("LAYER");

            layerLogger.LogDebug($"{layer}");
            foreach (var e in archive.Entries)
            {
                layerLogger.LogDebug($"    {Archive.PrintEntry(e.Value.Item2)}");
            }

            return(layer);
        }
Ejemplo n.º 3
0
        private async Task PushLayer(Func <string, System.IO.Stream> layerStream, BuilderLayer layer)
        {
            await RetryHelper.Retry(_retryUpload, _logger,
                                    async() =>
            {
                var uploadUri = await GetUploadUri();
                _logger.LogDebug($"uploading layer {layer.Digest}, {layer.Size} bytes.");

                using (var stream = layerStream($"{layer.Name}.tar.gz"))
                {
                    if (_chunckSize > 0)
                    {
                        await _registry.UploadBlobChuncks(uploadUri, layer.Digest, stream, _chunckSize);
                    }
                    else
                    {
                        await _registry.UploadBlob(uploadUri, layer.Digest, stream, layer.Size);
                    }
                }
            });
        }