Skip to content

Commit 225f042

Browse files
committed
Make the image platform configurable
1 parent 92af06f commit 225f042

9 files changed

Lines changed: 41 additions & 5 deletions

File tree

src/Testcontainers/Clients/DockerImageOperations.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public async Task CreateAsync(IImage image, IDockerRegistryAuthenticationConfigu
6060
var createParameters = new ImagesCreateParameters
6161
{
6262
FromImage = image.FullName,
63+
Platform = image.Platform,
6364
};
6465

6566
var authConfig = new AuthConfig

src/Testcontainers/Images/DockerImage.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,15 @@ public sealed class DockerImage : IImage
3131
[CanBeNull]
3232
private readonly string _digest;
3333

34+
[CanBeNull]
35+
private readonly string _platform;
36+
3437
/// <summary>
3538
/// Initializes a new instance of the <see cref="DockerImage" /> class.
3639
/// </summary>
3740
/// <param name="image">The image.</param>
3841
public DockerImage(IImage image)
39-
: this(image.Repository, image.Registry, image.Tag, image.Digest)
42+
: this(image.Repository, image.Registry, image.Tag, image.Digest, image.Platform)
4043
{
4144
}
4245

@@ -57,19 +60,22 @@ public DockerImage(string image)
5760
/// <param name="registry">The registry.</param>
5861
/// <param name="tag">The tag.</param>
5962
/// <param name="digest">The digest.</param>
63+
/// <param name="platform">The platform.</param>
6064
/// <param name="hubImageNamePrefix">The Docker Hub image name prefix.</param>
6165
/// <example><c>fedora/httpd:version1.0</c> where <c>fedora/httpd</c> is the repository and <c>version1.0</c> the tag.</example>
6266
public DockerImage(
6367
string repository,
6468
string registry = null,
6569
string tag = null,
6670
string digest = null,
71+
string platform = null,
6772
string hubImageNamePrefix = null)
6873
: this(
6974
TrimOrDefault(repository),
7075
TrimOrDefault(registry),
7176
TrimOrDefault(tag, tag == null && digest == null ? LatestTag : null),
7277
TrimOrDefault(digest),
78+
TrimOrDefault(platform),
7379
hubImageNamePrefix == null ? [] : hubImageNamePrefix.Trim(TrimChars).Split(SlashChar, 2, StringSplitOptions.RemoveEmptyEntries))
7480
{
7581
}
@@ -79,6 +85,7 @@ private DockerImage(
7985
string registry,
8086
string tag,
8187
string digest,
88+
string platform,
8289
string[] substitutions)
8390
{
8491
_ = Guard.Argument(repository, nameof(repository))
@@ -109,6 +116,7 @@ private DockerImage(
109116

110117
_tag = tag;
111118
_digest = digest;
119+
_platform = platform;
112120
}
113121

114122
/// <inheritdoc />
@@ -123,6 +131,9 @@ private DockerImage(
123131
/// <inheritdoc />
124132
public string Digest => _digest;
125133

134+
/// <inheritdoc />
135+
public string Platform => _platform;
136+
126137
/// <inheritdoc />
127138
public string FullName
128139
{

src/Testcontainers/Images/FutureDockerImage.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ public string Digest
6868
}
6969
}
7070

71+
/// <inheritdoc />
72+
public string Platform
73+
{
74+
get
75+
{
76+
ThrowIfResourceNotFound();
77+
return _configuration.Image.Platform;
78+
}
79+
}
80+
7181
/// <inheritdoc />
7282
public string FullName
7383
{

src/Testcontainers/Images/IImage.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ public interface IImage
3333
[CanBeNull]
3434
string Digest { get; }
3535

36+
/// <summary>
37+
/// Gets the platform. Supported format is <c>&lt;os&gt;|&lt;arch&gt;|&lt;os&gt;/&lt;arch&gt;[/&lt;variant&gt;]</c>. Either the operating system or the architecture or both can be provided.
38+
/// </summary>
39+
/// <remarks>
40+
/// See https://github.com/containerd/platforms for more information.
41+
/// </remarks>
42+
[CanBeNull]
43+
string Platform { get; }
44+
3645
/// <summary>
3746
/// Gets the full image name.
3847
/// </summary>

src/Testcontainers/Images/IImageExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public static IImage ApplyHubImageNamePrefix(this IImage image)
2727
return image;
2828
}
2929

30-
return new DockerImage(image.Repository, image.Registry, image.Tag, image.Digest, TestcontainersSettings.HubImageNamePrefix);
30+
return new DockerImage(image.Repository, image.Registry, image.Tag, image.Digest, image.Platform, TestcontainersSettings.HubImageNamePrefix);
3131
}
3232
}
3333
}

tests/Testcontainers.Tests/Fixtures/Images/DockerImageFixture.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public DockerImageFixture()
3737
Add(new DockerImageFixtureSerializable(new DockerImage(FedoraHttpd, PortSeparatorRegistry, CustomTag1, null)), $"{PortSeparatorRegistry}/{FedoraHttpd}:{CustomTag1}", $"{PortSeparatorRegistry}/{FedoraHttpd}:{CustomTag1}");
3838
Add(new DockerImageFixtureSerializable(new DockerImage(FooBarBaz, DotSeparatorRegistry, SemVerTag, Digest)), $"{DotSeparatorRegistry}/{FooBarBaz}:{SemVerTag}@{Digest}", $"{DotSeparatorRegistry}/{FooBarBaz}:{SemVerTag}@{Digest}");
3939
Add(new DockerImageFixtureSerializable(new DockerImage(FooBarBaz, DotSeparatorRegistry, null, Digest)), $"{DotSeparatorRegistry}/{FooBarBaz}@{Digest}", $"{DotSeparatorRegistry}/{FooBarBaz}@{Digest}");
40-
Add(new DockerImageFixtureSerializable(new DockerImage(BarBaz, null, null, null, HubImageNamePrefixImplicitLibrary)), $"{HubImageNamePrefixImplicitLibrary}/{BarBaz}", $"{HubImageNamePrefixImplicitLibrary}/{BarBaz}:{LatestTag}");
41-
Add(new DockerImageFixtureSerializable(new DockerImage(BarBaz, null, null, null, HubImageNamePrefixExplicitLibrary)), $"{HubImageNamePrefixExplicitLibrary}/{BarBaz}", $"{HubImageNamePrefixExplicitLibrary}/{BarBaz}:{LatestTag}");
40+
Add(new DockerImageFixtureSerializable(new DockerImage(BarBaz, null, null, null, null, HubImageNamePrefixImplicitLibrary)), $"{HubImageNamePrefixImplicitLibrary}/{BarBaz}", $"{HubImageNamePrefixImplicitLibrary}/{BarBaz}:{LatestTag}");
41+
Add(new DockerImageFixtureSerializable(new DockerImage(BarBaz, null, null, null, null, HubImageNamePrefixExplicitLibrary)), $"{HubImageNamePrefixExplicitLibrary}/{BarBaz}", $"{HubImageNamePrefixExplicitLibrary}/{BarBaz}:{LatestTag}");
4242
}
4343
}
4444
}

tests/Testcontainers.Tests/Fixtures/Images/DockerImageFixtureSerializable.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ public void Deserialize(IXunitSerializationInfo info)
2222
var registry = info.GetValue<string>("Registry");
2323
var tag = info.GetValue<string>("Tag");
2424
var digest = info.GetValue<string>("Digest");
25-
Image = new DockerImage(repository, registry, tag, digest);
25+
var platform = info.GetValue<string>("Platform");
26+
Image = new DockerImage(repository, registry, tag, digest, platform);
2627
}
2728

2829
public void Serialize(IXunitSerializationInfo info)
@@ -31,6 +32,7 @@ public void Serialize(IXunitSerializationInfo info)
3132
info.AddValue("Registry", Image.Registry);
3233
info.AddValue("Tag", Image.Tag);
3334
info.AddValue("Digest", Image.Digest);
35+
info.AddValue("Platform", Image.Platform);
3436
}
3537
}
3638
}

tests/Testcontainers.Tests/Fixtures/Images/HealthCheckFixture.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public sealed class HealthCheckFixture : IImage, IAsyncLifetime
2323

2424
public string Digest => _image.Digest;
2525

26+
public string Platform => _image.Platform;
27+
2628
public string FullName => _image.FullName;
2729

2830
public string GetHostname()

tests/Testcontainers.Tests/Unit/Images/TestcontainersImageTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public void WhenImageNameGetsAssigned(DockerImageFixtureSerializable serializabl
6565
Assert.Equal(expected.Registry, actual.Registry);
6666
Assert.Equal(expected.Tag, actual.Tag);
6767
Assert.Equal(expected.Digest, actual.Digest);
68+
Assert.Equal(expected.Platform, actual.Platform);
6869
Assert.Equal(expected.FullName, actual.FullName);
6970
Assert.Equal(fullName, actual.FullName);
7071
}

0 commit comments

Comments
 (0)