Skip to content

Commit e523920

Browse files
committed
Merge in 'release/8.0.1xx' changes
2 parents 9bcead5 + 94fa89f commit e523920

File tree

8 files changed

+27
-11
lines changed

8 files changed

+27
-11
lines changed

src/Containers/Microsoft.NET.Build.Containers/ContainerBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public static async Task<int> ContainerizeAsync(
9494
logger.LogInformation(Strings.ContainerBuilder_StartBuildingImage, imageName, string.Join(",", imageName), sourceImageReference);
9595
cancellationToken.ThrowIfCancellationRequested();
9696

97-
Layer newLayer = Layer.FromDirectory(publishDirectory.FullName, workingDir, imageBuilder.IsWindows);
97+
Layer newLayer = Layer.FromDirectory(publishDirectory.FullName, workingDir, imageBuilder.IsWindows, imageBuilder.ManifestMediaType);
9898
imageBuilder.AddLayer(newLayer);
9999
imageBuilder.SetWorkingDirectory(workingDir);
100100

src/Containers/Microsoft.NET.Build.Containers/ImageBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ internal sealed class ImageBuilder
2626

2727
public ImageConfig BaseImageConfig => _baseImageConfig;
2828

29+
/// <summary>
30+
/// MediaType of the output manifest.
31+
/// </summary>
32+
public string ManifestMediaType => _manifest.MediaType; // output the same media type as the base image manifest.
33+
2934
internal ImageBuilder(ManifestV2 manifest, ImageConfig baseImageConfig, ILogger logger)
3035
{
3136
_manifest = manifest;

src/Containers/Microsoft.NET.Build.Containers/Layer.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.IO.Compression;
77
using System.Security.Cryptography;
88
using System.IO.Enumeration;
9+
using Microsoft.NET.Build.Containers.Resources;
910

1011
namespace Microsoft.NET.Build.Containers;
1112

@@ -49,7 +50,7 @@ public static Layer FromDescriptor(Descriptor descriptor)
4950
return new(ContentStore.PathForDescriptor(descriptor), descriptor);
5051
}
5152

52-
public static Layer FromDirectory(string directory, string containerPath, bool isWindowsLayer)
53+
public static Layer FromDirectory(string directory, string containerPath, bool isWindowsLayer, string manifestMediaType)
5354
{
5455
long fileSize;
5556
Span<byte> hash = stackalloc byte[SHA256.HashSizeInBytes];
@@ -186,9 +187,17 @@ static UnixFileMode DetermineFileMode(FileSystemInfo file)
186187
string contentHash = Convert.ToHexString(hash).ToLowerInvariant();
187188
string uncompressedContentHash = Convert.ToHexString(uncompressedHash).ToLowerInvariant();
188189

190+
string layerMediaType = manifestMediaType switch
191+
{
192+
// TODO: configurable? gzip always?
193+
SchemaTypes.DockerManifestV2 => SchemaTypes.DockerLayerGzip,
194+
SchemaTypes.OciManifestV1 => SchemaTypes.OciLayerGzipV1,
195+
_ => throw new ArgumentException(Resource.FormatString(nameof(Strings.UnrecognizedMediaType), manifestMediaType))
196+
};
197+
189198
Descriptor descriptor = new()
190199
{
191-
MediaType = "application/vnd.docker.image.rootfs.diff.tar.gzip", // TODO: configurable? gzip always?
200+
MediaType = layerMediaType,
192201
Size = fileSize,
193202
Digest = $"sha256:{contentHash}",
194203
UncompressedDigest = $"sha256:{uncompressedContentHash}",

src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultManifestOperations.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public async Task PutAsync(string repositoryName, string reference, ManifestV2 m
4242
{
4343
string jsonString = JsonSerializer.SerializeToNode(manifest)?.ToJsonString() ?? "";
4444
HttpContent manifestUploadContent = new StringContent(jsonString);
45-
manifestUploadContent.Headers.ContentType = new MediaTypeHeaderValue(SchemaTypes.DockerManifestV2);
45+
manifestUploadContent.Headers.ContentType = new MediaTypeHeaderValue(manifest.MediaType);
4646

4747
HttpResponseMessage putResponse = await _client.PutAsync(new Uri(_baseUri, $"/v2/{repositoryName}/manifests/{reference}"), manifestUploadContent, cancellationToken).ConfigureAwait(false);
4848

src/Containers/Microsoft.NET.Build.Containers/Registry/SchemaTypes.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ internal class SchemaTypes
1010
internal const string DockerManifestListV2 = "application/vnd.docker.distribution.manifest.list.v2+json";
1111
internal const string DockerManifestV2 = "application/vnd.docker.distribution.manifest.v2+json";
1212
internal const string OciManifestV1 = "application/vnd.oci.image.manifest.v1+json"; // https://containers.gitbook.io/build-containers-the-hard-way/#registry-format-oci-image-manifest
13+
internal const string DockerLayerGzip = "application/vnd.docker.image.rootfs.diff.tar.gzip";
14+
internal const string OciLayerGzipV1 = "application/vnd.oci.image.layer.v1.tar+gzip";
1315
}

src/Containers/Microsoft.NET.Build.Containers/Tasks/CreateNewImage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ internal async Task<bool> ExecuteAsync(CancellationToken cancellationToken)
100100

101101
SafeLog(Strings.ContainerBuilder_StartBuildingImage, Repository, String.Join(",", ImageTags), sourceImageReference);
102102

103-
Layer newLayer = Layer.FromDirectory(PublishDirectory, WorkingDirectory, imageBuilder.IsWindows);
103+
Layer newLayer = Layer.FromDirectory(PublishDirectory, WorkingDirectory, imageBuilder.IsWindows, imageBuilder.ManifestMediaType);
104104
imageBuilder.AddLayer(newLayer);
105105
imageBuilder.SetWorkingDirectory(WorkingDirectory);
106106

src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public async Task ApiEndToEndWithRegistryPushAndPull()
5757

5858
Assert.NotNull(imageBuilder);
5959

60-
Layer l = Layer.FromDirectory(publishDirectory, "/app", false);
60+
Layer l = Layer.FromDirectory(publishDirectory, "/app", false, imageBuilder.ManifestMediaType);
6161

6262
imageBuilder.AddLayer(l);
6363

@@ -103,7 +103,7 @@ public async Task ApiEndToEndWithLocalLoad()
103103
cancellationToken: default).ConfigureAwait(false);
104104
Assert.NotNull(imageBuilder);
105105

106-
Layer l = Layer.FromDirectory(publishDirectory, "/app", false);
106+
Layer l = Layer.FromDirectory(publishDirectory, "/app", false, imageBuilder.ManifestMediaType);
107107

108108
imageBuilder.AddLayer(l);
109109

@@ -144,7 +144,7 @@ public async Task ApiEndToEndWithArchiveWritingAndLoad()
144144
cancellationToken: default).ConfigureAwait(false);
145145
Assert.NotNull(imageBuilder);
146146

147-
Layer l = Layer.FromDirectory(publishDirectory, "/app", false);
147+
Layer l = Layer.FromDirectory(publishDirectory, "/app", false, imageBuilder.ManifestMediaType);
148148

149149
imageBuilder.AddLayer(l);
150150

@@ -489,7 +489,7 @@ public async Task CanPackageForAllSupportedContainerRIDs(string dockerPlatform,
489489
cancellationToken: default).ConfigureAwait(false);
490490
Assert.NotNull(imageBuilder);
491491

492-
Layer l = Layer.FromDirectory(publishDirectory, isWin ? "C:\\app" : "/app", isWin);
492+
Layer l = Layer.FromDirectory(publishDirectory, isWin ? "C:\\app" : "/app", isWin, imageBuilder.ManifestMediaType);
493493

494494
imageBuilder.AddLayer(l);
495495
imageBuilder.SetWorkingDirectory(workingDir);

src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/LayerEndToEndTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void SingleFileInFolder()
2929

3030
File.WriteAllText(testFilePath, testString);
3131

32-
Layer l = Layer.FromDirectory(directory: folder.Path, containerPath: "/app", false);
32+
Layer l = Layer.FromDirectory(directory: folder.Path, containerPath: "/app", false, SchemaTypes.DockerManifestV2);
3333

3434
Console.WriteLine(l.Descriptor);
3535

@@ -54,7 +54,7 @@ public void SingleFileInFolderWindows()
5454

5555
File.WriteAllText(testFilePath, testString);
5656

57-
Layer l = Layer.FromDirectory(directory: folder.Path, containerPath: "C:\\app", true);
57+
Layer l = Layer.FromDirectory(directory: folder.Path, containerPath: "C:\\app", true, SchemaTypes.DockerManifestV2);
5858

5959
var allEntries = LoadAllTarEntries(l.BackingFile);
6060
Assert.True(allEntries.TryGetValue("Files", out var filesEntry) && filesEntry.EntryType == TarEntryType.Directory, "Missing Files directory entry");

0 commit comments

Comments
 (0)