diff --git a/core/src/main/java/org/testcontainers/utility/DockerImageName.java b/core/src/main/java/org/testcontainers/utility/DockerImageName.java index e3a35855bf8..1046c84a4d4 100644 --- a/core/src/main/java/org/testcontainers/utility/DockerImageName.java +++ b/core/src/main/java/org/testcontainers/utility/DockerImageName.java @@ -87,8 +87,15 @@ public DockerImageName(String fullImageName) { } if (remoteName.contains("@sha256:")) { - repository = remoteName.split("@sha256:")[0]; - versioning = new Sha256Versioning(remoteName.split("@sha256:")[1]); + String[] parts = remoteName.split("@sha256:"); + if (parts[0].contains(":")) { + String[] repositoryAndTag = parts[0].split(":"); + repository = repositoryAndTag[0]; + versioning = new Versioning.TagSha256Versioning(repositoryAndTag[1], parts[1]); + } else { + repository = parts[0]; + versioning = new Sha256Versioning(parts[1]); + } } else if (remoteName.contains(":")) { repository = remoteName.split(":")[0]; versioning = new TagVersioning(remoteName.split(":")[1]); diff --git a/core/src/main/java/org/testcontainers/utility/Versioning.java b/core/src/main/java/org/testcontainers/utility/Versioning.java index 372a105518f..7f281b108e0 100644 --- a/core/src/main/java/org/testcontainers/utility/Versioning.java +++ b/core/src/main/java/org/testcontainers/utility/Versioning.java @@ -98,4 +98,36 @@ public String toString() { return "sha256:" + hash; } } + + @EqualsAndHashCode + class TagSha256Versioning implements Versioning { + + public static final String TAG_REGEX = "[\\w][\\w.\\-]{0,127}"; + + public static final String HASH_REGEX = "[0-9a-fA-F]{32,}"; + + private final String tag; + + private final String hash; + + TagSha256Versioning(String tag, String hash) { + this.tag = tag; + this.hash = hash; + } + + @Override + public boolean isValid() { + return tag.matches(TAG_REGEX) && hash.matches(HASH_REGEX); + } + + @Override + public String getSeparator() { + return ":"; + } + + @Override + public String toString() { + return tag + "@sha256:" + hash; + } + } } diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java index 7d6f8cd2633..4bd1e0c22e7 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java @@ -24,6 +24,7 @@ public static String[] getNames() { "registry.foo.com:1234/repo_here/my-name:1.0", "registry.foo.com:1234/repo-here/my-name@sha256:1234abcd1234abcd1234abcd1234abcd", "registry.foo.com:1234/my-name@sha256:1234abcd1234abcd1234abcd1234abcd", + "registry.foo.com:1234/my-name:my-tag@sha256:1234abcd1234abcd1234abcd1234abcd", "1.2.3.4/my-name:1.0", "1.2.3.4:1234/my-name:1.0", "1.2.3.4/repo-here/my-name:1.0", @@ -64,33 +65,34 @@ class Parsing { public static Stream getNames() { return Stream.of( - Arguments.of("", "", "myname", ":", null), - Arguments.of("", "", "myname", ":", "latest"), - Arguments.of("", "", "repo/myname", ":", null), - Arguments.of("", "", "repo/myname", ":", "latest"), - Arguments.of("registry.foo.com:1234", "/", "my-name", ":", null), - Arguments.of("registry.foo.com:1234", "/", "my-name", ":", "1.0"), - Arguments.of("registry.foo.com", "/", "my-name", ":", "1.0"), - Arguments.of("registry.foo.com:1234", "/", "repo_here/my-name", ":", null), - Arguments.of("registry.foo.com:1234", "/", "repo_here/my-name", ":", "1.0"), - Arguments.of("1.2.3.4:1234", "/", "repo_here/my-name", ":", null), - Arguments.of("1.2.3.4:1234", "/", "repo_here/my-name", ":", "1.0"), - Arguments.of("1.2.3.4:1234", "/", "my-name", ":", null), - Arguments.of("1.2.3.4:1234", "/", "my-name", ":", "1.0"), - Arguments.of("", "", "myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), - Arguments.of("", "", "repo/myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), - Arguments.of( - "registry.foo.com:1234", - "/", - "repo-here/my-name", - "@", - "sha256:1234abcd1234abcd1234abcd1234abcd" - ), - Arguments.of("registry.foo.com:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), - Arguments.of("1.2.3.4", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), - Arguments.of("1.2.3.4:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), - Arguments.of("1.2.3.4", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), - Arguments.of("1.2.3.4:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd") + // Arguments.of("", "", "myname", ":", null), + // Arguments.of("", "", "myname", ":", "latest"), + // Arguments.of("", "", "repo/myname", ":", null), + // Arguments.of("", "", "repo/myname", ":", "latest"), + // Arguments.of("registry.foo.com:1234", "/", "my-name", ":", null), + // Arguments.of("registry.foo.com:1234", "/", "my-name", ":", "1.0"), + // Arguments.of("registry.foo.com", "/", "my-name", ":", "1.0"), + // Arguments.of("registry.foo.com:1234", "/", "repo_here/my-name", ":", null), + // Arguments.of("registry.foo.com:1234", "/", "repo_here/my-name", ":", "1.0"), + // Arguments.of("1.2.3.4:1234", "/", "repo_here/my-name", ":", null), + // Arguments.of("1.2.3.4:1234", "/", "repo_here/my-name", ":", "1.0"), + // Arguments.of("1.2.3.4:1234", "/", "my-name", ":", null), + // Arguments.of("1.2.3.4:1234", "/", "my-name", ":", "1.0"), + // Arguments.of("", "", "myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + // Arguments.of("", "", "repo/myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + // Arguments.of( + // "registry.foo.com:1234", + // "/", + // "repo-here/my-name", + // "@", + // "sha256:1234abcd1234abcd1234abcd1234abcd" + // ), + // Arguments.of("registry.foo.com:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + // Arguments.of("1.2.3.4", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + // Arguments.of("1.2.3.4:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + // Arguments.of("1.2.3.4", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + // Arguments.of("1.2.3.4:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + Arguments.of("1.2.3.4:1234", "/", "my-name", ":", "my-tag@sha256:1234abcd1234abcd1234abcd1234abcd") ); }