From ad106404571dbcc2b2332fd59630d0442aee5d36 Mon Sep 17 00:00:00 2001 From: Richard North Date: Fri, 22 May 2020 12:57:39 +0100 Subject: [PATCH 1/2] Ensure that ParsedDockerfile supports platform args Fixes #2772 Also make parsing case insensitive, for better compliance with Dockerfile spec --- .../org/testcontainers/images/ParsedDockerfile.java | 4 ++-- .../testcontainers/images/ParsedDockerfileTest.java | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java b/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java index 1ad43813757..368722871c6 100644 --- a/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java @@ -21,7 +21,7 @@ @Slf4j public class ParsedDockerfile { - private static final Pattern FROM_LINE_PATTERN = Pattern.compile("FROM ([^\\s]+).*"); + private static final Pattern FROM_LINE_PATTERN = Pattern.compile("FROM (?--[^\\s]+\\s)?(?[^\\s]+).*", Pattern.CASE_INSENSITIVE); private final Path dockerFilePath; @@ -57,7 +57,7 @@ private void parse(List lines) { dependencyImageNames = lines.stream() .map(FROM_LINE_PATTERN::matcher) .filter(Matcher::matches) - .map(matcher -> matcher.group(1)) + .map(matcher -> matcher.group("image")) .collect(Collectors.toSet()); if (!dependencyImageNames.isEmpty()) { diff --git a/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java b/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java index e2b97f9fab7..376557dd177 100644 --- a/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java +++ b/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java @@ -16,6 +16,12 @@ public void doesSimpleParsing() { assertEquals("extracts a single image name", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames()); } + @Test + public void isCaseInsensitive() { + final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("from someimage", "RUN something")); + assertEquals("extracts a single image name", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames()); + } + @Test public void handlesTags() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("FROM someimage:tag", "RUN something")); @@ -40,6 +46,12 @@ public void ignoringBuildStageNames() { assertEquals("ignores build stage names and allows multiple images to be extracted", Sets.newHashSet("someimage", "nextimage"), parsedDockerfile.getDependencyImageNames()); } + @Test + public void ignoringPlatformArgs() { + final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("FROM --platform=linux/amd64 someimage", "RUN something")); + assertEquals("ignores platform args", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames()); + } + @Test public void handlesGracefullyIfNoFromLine() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("RUN something", "# is this even a valid Dockerfile?")); From 98a492b546922c3fb0d086a6e9e56532514dd183 Mon Sep 17 00:00:00 2001 From: Richard North Date: Thu, 28 May 2020 13:56:05 +0100 Subject: [PATCH 2/2] Ignore multiple args if present --- .../java/org/testcontainers/images/ParsedDockerfile.java | 2 +- .../org/testcontainers/images/ParsedDockerfileTest.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java b/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java index 368722871c6..d4574d17c34 100644 --- a/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java @@ -21,7 +21,7 @@ @Slf4j public class ParsedDockerfile { - private static final Pattern FROM_LINE_PATTERN = Pattern.compile("FROM (?--[^\\s]+\\s)?(?[^\\s]+).*", Pattern.CASE_INSENSITIVE); + private static final Pattern FROM_LINE_PATTERN = Pattern.compile("FROM (?--[^\\s]+\\s)*(?[^\\s]+).*", Pattern.CASE_INSENSITIVE); private final Path dockerFilePath; diff --git a/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java b/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java index 376557dd177..52a22c83b00 100644 --- a/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java +++ b/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java @@ -52,6 +52,12 @@ public void ignoringPlatformArgs() { assertEquals("ignores platform args", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames()); } + @Test + public void ignoringExtraPlatformArgs() { + final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("FROM --platform=linux/amd64 --somethingelse=value someimage", "RUN something")); + assertEquals("ignores platform args", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames()); + } + @Test public void handlesGracefullyIfNoFromLine() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("RUN something", "# is this even a valid Dockerfile?"));