Skip to content

Commit

Permalink
fix: Prepend Docker Hub namespace to repository (#1287)
Browse files Browse the repository at this point in the history
  • Loading branch information
HofmeisterAn authored Nov 8, 2024
1 parent 0ad2b49 commit db02434
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 12 deletions.
54 changes: 42 additions & 12 deletions src/Testcontainers/Images/DockerImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public sealed class DockerImage : IImage

private static readonly char[] TrimChars = [' ', ':', '/'];

private static readonly char[] SlashChar = ['/'];

private static readonly Func<string, IImage> GetDockerImage = MatchImage.Match;

[NotNull]
Expand All @@ -27,10 +29,7 @@ public sealed class DockerImage : IImage
private readonly string _tag;

[CanBeNull]
private readonly string _digit;

[CanBeNull]
private readonly string _hubImageNamePrefix;
private readonly string _digest;

/// <summary>
/// Initializes a new instance of the <see cref="DockerImage" /> class.
Expand Down Expand Up @@ -66,32 +65,63 @@ public DockerImage(
string tag = null,
string digest = null,
string hubImageNamePrefix = null)
: this(
TrimOrDefault(repository),
TrimOrDefault(registry),
TrimOrDefault(tag, tag == null && digest == null ? LatestTag : null),
TrimOrDefault(digest),
hubImageNamePrefix == null ? [] : hubImageNamePrefix.Trim(TrimChars).Split(SlashChar, 2, StringSplitOptions.RemoveEmptyEntries))
{
}

private DockerImage(
string repository,
string registry,
string tag,
string digest,
string[] substitutions)
{
_ = Guard.Argument(repository, nameof(repository))
.NotNull()
.NotEmpty()
.NotUppercase();

var defaultTag = tag == null && digest == null ? LatestTag : null;
_ = Guard.Argument(substitutions, nameof(substitutions))
.NotNull();

// The Docker Hub image name prefix may include namespaces, which we need to extract
// and prepend to the repository name. The registry itself contains only the hostname.
switch (substitutions.Length)
{
case 2:
_repository = string.Join("/", substitutions[1], repository);
_registry = substitutions[0];
break;
case 1:
_repository = repository;
_registry = substitutions[0];
break;
default:
_repository = repository;
_registry = registry;
break;
}

_repository = TrimOrDefault(repository);
_registry = TrimOrDefault(registry);
_tag = TrimOrDefault(tag, defaultTag);
_digit = TrimOrDefault(digest);
_hubImageNamePrefix = TrimOrDefault(hubImageNamePrefix);
_tag = tag;
_digest = digest;
}

/// <inheritdoc />
public string Repository => _repository;

/// <inheritdoc />
public string Registry => string.IsNullOrEmpty(_hubImageNamePrefix) ? _registry : _hubImageNamePrefix;
public string Registry => _registry;

/// <inheritdoc />
public string Tag => _tag;

/// <inheritdoc />
public string Digest => _digit;
public string Digest => _digest;

/// <inheritdoc />
public string FullName
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public sealed class DockerImageFixture : TheoryData<DockerImageFixtureSerializab
private const string DotSeparatorRegistry = "myregistry.azurecr.io";
private const string PortSeparatorRegistry = "myregistry:5000";
private const string Digest = "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
private const string HubImageNamePrefixImplicitLibrary = "myregistry.azurecr.io";
private const string HubImageNamePrefixExplicitLibrary = "myregistry.azurecr.io/library";

public DockerImageFixture()
{
Expand All @@ -35,6 +37,8 @@ public DockerImageFixture()
Add(new DockerImageFixtureSerializable(new DockerImage(FedoraHttpd, PortSeparatorRegistry, CustomTag1, null)), $"{PortSeparatorRegistry}/{FedoraHttpd}:{CustomTag1}", $"{PortSeparatorRegistry}/{FedoraHttpd}:{CustomTag1}");
Add(new DockerImageFixtureSerializable(new DockerImage(FooBarBaz, DotSeparatorRegistry, SemVerTag, Digest)), $"{DotSeparatorRegistry}/{FooBarBaz}:{SemVerTag}@{Digest}", $"{DotSeparatorRegistry}/{FooBarBaz}:{SemVerTag}@{Digest}");
Add(new DockerImageFixtureSerializable(new DockerImage(FooBarBaz, DotSeparatorRegistry, null, Digest)), $"{DotSeparatorRegistry}/{FooBarBaz}@{Digest}", $"{DotSeparatorRegistry}/{FooBarBaz}@{Digest}");
Add(new DockerImageFixtureSerializable(new DockerImage(FooBarBaz, null, null, null, HubImageNamePrefixImplicitLibrary)), $"{HubImageNamePrefixImplicitLibrary}/{FooBarBaz}", $"{HubImageNamePrefixImplicitLibrary}/{FooBarBaz}:{LatestTag}");
Add(new DockerImageFixtureSerializable(new DockerImage(FooBarBaz, null, null, null, HubImageNamePrefixExplicitLibrary)), $"{HubImageNamePrefixExplicitLibrary}/{FooBarBaz}", $"{HubImageNamePrefixExplicitLibrary}/{FooBarBaz}:{LatestTag}");
}
}
}

0 comments on commit db02434

Please sign in to comment.