diff --git a/core/src/main/java/org/testcontainers/utility/DockerImageName.java b/core/src/main/java/org/testcontainers/utility/DockerImageName.java index b3babc29c91..58eb32482f0 100644 --- a/core/src/main/java/org/testcontainers/utility/DockerImageName.java +++ b/core/src/main/java/org/testcontainers/utility/DockerImageName.java @@ -97,8 +97,12 @@ public DockerImageName(String fullImageName) { versioning = new Sha256Versioning(remoteName.split("@sha256:")[1]); } } else if (remoteName.contains(":")) { - repository = remoteName.split(":")[0]; - versioning = new TagVersioning(remoteName.split(":")[1]); + String[] repositoryAndTag = remoteName.split(":", 2); + if (repositoryAndTag[1].isEmpty()) { + throw new IllegalArgumentException("Missing tag after ':' in image name " + fullImageName); + } + repository = repositoryAndTag[0]; + versioning = new TagVersioning(repositoryAndTag[1]); } else { repository = remoteName; versioning = Versioning.ANY; diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java index 5b42322d678..85a14c3c84f 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java @@ -51,6 +51,9 @@ public static String[] getNames() { "/myname@sha256:latest", "/myname@sha256:gggggggggggggggggggggggggggggggg", "repo:notaport/myname:latest", + "myname:myname:1.0", + "repo/my-name:1.0:extra", + "registry.foo.com:1234/my-name:1.0:extra", }; } @@ -149,6 +152,22 @@ void testParsing( .isEqualTo(version); } } + + @Test + void testExtraColonInTagIsNotDropped() { + final DockerImageName imageName = DockerImageName.parse("neo4j:neo4j:4.4"); + + assertThat(imageName.getRepository()).isEqualTo("neo4j"); + assertThat(imageName.getVersionPart()).isEqualTo("neo4j:4.4"); + assertThat(imageName.asCanonicalNameString()).isEqualTo("neo4j:neo4j:4.4"); + } + + @Test + void testEmptyTagIsRejected() { + assertThatThrownBy(() -> DockerImageName.parse("myname:")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("myname:"); + } } @Nested