public async Task WriteToAsync(Stream @out) { TarStreamBuilder tarStreamBuilder = new TarStreamBuilder(); DockerLoadManifestEntryTemplate manifestTemplate = new DockerLoadManifestEntryTemplate(); // Adds all the layers to the tarball and manifest. foreach (ILayer layer in image.GetLayers()) { string layerName = layer.GetBlobDescriptor().GetDigest().GetHash() + LAYER_FILE_EXTENSION; tarStreamBuilder.AddBlobEntry( layer.GetBlob(), layer.GetBlobDescriptor().GetSize(), layerName); manifestTemplate.AddLayerFile(layerName); } // Adds the container configuration to the tarball. ContainerConfigurationTemplate containerConfiguration = new ImageToJsonTranslator(image).GetContainerConfiguration(); tarStreamBuilder.AddByteEntry( JsonTemplateMapper.ToByteArray(containerConfiguration), CONTAINER_CONFIGURATION_JSON_FILE_NAME); // Adds the manifest to tarball. manifestTemplate.SetRepoTags(imageReference.ToStringWithTag()); tarStreamBuilder.AddByteEntry( JsonTemplateMapper.ToByteArray(new List <DockerLoadManifestEntryTemplate> { manifestTemplate }), MANIFEST_JSON_FILE_NAME); await tarStreamBuilder.WriteAsTarArchiveToAsync(@out).ConfigureAwait(false); }
public void Setup() { testTarStreamBuilder = new TarStreamBuilder(); // Gets the test resource files. fileA = Paths.Get(TestResources.GetResource("core/fileA").ToURI()); fileB = Paths.Get(TestResources.GetResource("core/fileB").ToURI()); directoryA = Paths.Get(TestResources.GetResource("core/directoryA").ToURI()); fileAContents = Files.ReadAllBytes(fileA); fileBContents = Files.ReadAllBytes(fileB); }
/** Creates a TarStreamBuilder using Strings and TarArchiveEntries. */ private void SetUpWithStringsAndTarEntries() { // Prepares a test TarStreamBuilder. testTarStreamBuilder.AddByteEntry(fileAContents, "some/path/to/resourceFileA"); testTarStreamBuilder.AddTarArchiveEntry(TarStreamBuilder.CreateEntryFromFile(fileB.ToFile(), "crepecake")); testTarStreamBuilder.AddTarArchiveEntry( TarStreamBuilder.CreateEntryFromFile(directoryA.ToFile(), "some/path/to/")); testTarStreamBuilder.AddByteEntry( fileAContents, "some/really/long/path/that/exceeds/100/characters/abcdefghijklmnopqrstuvwxyz0123456789012345678901234567890"); }
/** * Builds and returns the layer {@link Blob}. * * @return the new layer */ public IBlob Build() { UniqueTarArchiveEntries uniqueTarArchiveEntries = new UniqueTarArchiveEntries(); // Adds all the layer entries as tar entries. foreach (LayerEntry layerEntry in layerEntries) { // Adds the entries to uniqueTarArchiveEntries, which makes sure all entries are unique and // adds parent directories for each extraction path. TarEntry entry = TarEntry.CreateEntryFromFile(layerEntry.SourceFile); entry.Name = layerEntry.ExtractionPath.ToString().TrimStart('/'); if (Directory.Exists(layerEntry.SourceFile)) { entry.Name += '/'; entry.TarHeader.TypeFlag = TarHeader.LF_DIR; } // Sets the entry's permissions by masking out the permission bits from the entry's mode (the // lowest 9 bits) then using a bitwise OR to set them to the layerEntry's permissions. entry.SetMode((entry.GetMode() & ~PosixFilePermissions.All) | layerEntry.Permissions.GetPermissionBits()); entry.ModTime = DateTimeOffset.FromUnixTimeMilliseconds(layerEntry.LastModifiedTime.ToUnixTimeMilliseconds()).DateTime; uniqueTarArchiveEntries.Add(entry); } // Gets the entries sorted by extraction path. IList <TarEntry> sortedFilesystemEntries = uniqueTarArchiveEntries.GetSortedEntries(); HashSet <string> names = new HashSet <string>(); // Adds all the files to a tar stream. TarStreamBuilder tarStreamBuilder = new TarStreamBuilder(); foreach (TarEntry entry in sortedFilesystemEntries) { // Strips out all non-reproducible elements from tar archive entries. // Modified time is configured per entry entry.TarHeader.GroupId = 0; entry.TarHeader.UserId = 0; entry.TarHeader.UserName = ""; entry.TarHeader.GroupName = ""; Debug.Assert(!names.Contains(entry.Name)); names.Add(entry.Name); tarStreamBuilder.AddTarArchiveEntry(entry); } return(Blobs.From(tarStreamBuilder.WriteAsTarArchiveToAsync, -1)); }