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, }); }
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); }
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); } } }); }