diff --git a/src/Testcontainers.FakeGcsServer/FakeGcsServerBuilder.cs b/src/Testcontainers.FakeGcsServer/FakeGcsServerBuilder.cs index 7e482a141..1dab125cf 100644 --- a/src/Testcontainers.FakeGcsServer/FakeGcsServerBuilder.cs +++ b/src/Testcontainers.FakeGcsServer/FakeGcsServerBuilder.cs @@ -4,7 +4,7 @@ namespace Testcontainers.FakeGcsServer; [PublicAPI] public sealed class FakeGcsServerBuilder : ContainerBuilder { - public const string FakeGcsServerImage = "fsouza/fake-gcs-server:1.47.5"; + public const string FakeGcsServerImage = "fsouza/fake-gcs-server:1.47"; public const ushort FakeGcsServerPort = 4443; diff --git a/src/Testcontainers/Clients/FilterByProperty.cs b/src/Testcontainers/Clients/FilterByProperty.cs index 17d4ff77f..9be23a645 100644 --- a/src/Testcontainers/Clients/FilterByProperty.cs +++ b/src/Testcontainers/Clients/FilterByProperty.cs @@ -5,10 +5,11 @@ namespace DotNet.Testcontainers.Clients internal sealed class FilterByProperty : ConcurrentDictionary> { - public void Add(string property, string value) + public FilterByProperty Add(string property, string value) { var values = GetOrAdd(property, _ => new Dictionary()); values[value] = true; + return this; } } } diff --git a/src/Testcontainers/Clients/TestcontainersClient.cs b/src/Testcontainers/Clients/TestcontainersClient.cs index 737b82bf3..e122610d4 100644 --- a/src/Testcontainers/Clients/TestcontainersClient.cs +++ b/src/Testcontainers/Clients/TestcontainersClient.cs @@ -330,7 +330,18 @@ public async Task BuildAsync(IImageFromDockerfileConfiguration configura { var dockerfileArchive = new DockerfileArchive(configuration.DockerfileDirectory, configuration.Dockerfile, configuration.Image, _logger); - await Task.WhenAll(dockerfileArchive.GetBaseImages().Select(image => PullImageAsync(image, ct))) + var baseImages = dockerfileArchive.GetBaseImages().ToArray(); + + var filters = baseImages.Aggregate(new FilterByProperty(), (dictionary, baseImage) => dictionary.Add("reference", baseImage.FullName)); + + var cachedImages = await Image.GetAllAsync(filters, ct) + .ConfigureAwait(false); + + var repositoryTags = new HashSet(cachedImages.SelectMany(image => image.RepoTags)); + + var uncachedImages = baseImages.Where(baseImage => !repositoryTags.Contains(baseImage.FullName)); + + await Task.WhenAll(uncachedImages.Select(image => PullImageAsync(image, ct))) .ConfigureAwait(false); _ = await Image.BuildAsync(configuration, dockerfileArchive, ct) diff --git a/tests/Testcontainers.Tests/Assets/pullBaseImages/Dockerfile b/tests/Testcontainers.Tests/Assets/pullBaseImages/Dockerfile index dcce54943..2ea2ba0c4 100644 --- a/tests/Testcontainers.Tests/Assets/pullBaseImages/Dockerfile +++ b/tests/Testcontainers.Tests/Assets/pullBaseImages/Dockerfile @@ -5,5 +5,11 @@ FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build FROM mcr.microsoft.com/dotnet/runtime:6.0 AS runtime FROM build FROM build AS publish -FROM mcr.microsoft.com/dotnet/aspnet:6.0.21-jammy-amd64 -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/aspnet:6.0.22-jammy-amd64 +FROM mcr.microsoft.com/dotnet/aspnet:6.0.22-jammy-amd64 + +# https://github.com/testcontainers/testcontainers-dotnet/issues/993. +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/aspnet:6.0.23-jammy-amd64 + +# https://github.com/testcontainers/testcontainers-dotnet/issues/1030. +FROM mcr.microsoft.com/dotnet/sdk:$SDK_VERSION_6_0 AS build_sdk_6_0 +FROM build_sdk_6_0 AS publish_sdk_6_0 diff --git a/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs b/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs index c44d20ea6..815a4b5c5 100644 --- a/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs +++ b/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs @@ -30,8 +30,8 @@ public void DockerfileArchiveGetBaseImages() Assert.Equal(4, baseImages.Length); Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/sdk:6.0".Equals(item.FullName)); Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/runtime:6.0".Equals(item.FullName)); - Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/aspnet:6.0.21-jammy-amd64".Equals(item.FullName)); Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/aspnet:6.0.22-jammy-amd64".Equals(item.FullName)); + Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/aspnet:6.0.23-jammy-amd64".Equals(item.FullName)); } [Fact]