From c47e0541e096c57a272e6dde97fd7e039fbb4bcd Mon Sep 17 00:00:00 2001
From: Jens Andersen
Date: Tue, 19 Mar 2024 16:53:40 +0100
Subject: [PATCH 1/3] Allow runCmds to change user. As discussed in
https://github.com/fabric8io/docker-maven-plugin/issues/913#issuecomment-378725546,
except the user tag is not limited to the first entry. A user tag will
however disable the optimize option.
Signed-off-by: Jens Andersen
---
.../asciidoc/inc/build/_configuration.adoc | 4 +-
.../io/fabric8/maven/docker/BuildMojo.java | 2 +-
.../io/fabric8/maven/docker/CopyMojo.java | 29 ++--
.../io/fabric8/maven/docker/LogsMojo.java | 2 +-
.../maven/docker/MojoConfigurator.java | 46 ++++++
.../io/fabric8/maven/docker/PushMojo.java | 3 +-
.../io/fabric8/maven/docker/RemoveMojo.java | 3 +-
.../java/io/fabric8/maven/docker/RunMojo.java | 2 +-
.../io/fabric8/maven/docker/SaveMojo.java | 17 +-
.../io/fabric8/maven/docker/SourceMojo.java | 13 +-
.../io/fabric8/maven/docker/StartMojo.java | 34 ++--
.../io/fabric8/maven/docker/StopMojo.java | 33 ++--
.../java/io/fabric8/maven/docker/TagMojo.java | 2 +-
.../maven/docker/VolumeCreateMojo.java | 2 +-
.../maven/docker/VolumeRemoveMojo.java | 3 +-
.../io/fabric8/maven/docker/WatchMojo.java | 8 +-
.../docker/assembly/DockerFileBuilder.java | 50 +++---
.../config/BuildImageConfiguration.java | 25 ++-
.../maven/docker/config/RunCommand.java | 65 ++++++++
.../maven/docker/config/RunCommandParam.java | 45 +++++
.../property/PropertyConfigHandler.java | 155 ++++++++++++++++--
.../handler/property/ValueProvider.java | 25 ++-
.../maven/docker/util/AuthConfigFactory.java | 73 ++++-----
.../maven/docker/PushMojoBuildXTest.java | 2 +-
.../assembly/DockerFileBuilderTest.java | 60 +++++--
.../property/PropertyConfigHandlerTest.java | 16 +-
.../docker/service/RegistryServiceTest.java | 21 ++-
.../docker/util/AuthConfigFactoryTest.java | 2 +-
.../docker/Dockerfile_user_change.test | 14 ++
29 files changed, 560 insertions(+), 196 deletions(-)
create mode 100644 src/main/java/io/fabric8/maven/docker/MojoConfigurator.java
create mode 100644 src/main/java/io/fabric8/maven/docker/config/RunCommand.java
create mode 100644 src/main/java/io/fabric8/maven/docker/config/RunCommandParam.java
create mode 100644 src/test/resources/docker/Dockerfile_user_change.test
diff --git a/src/main/asciidoc/inc/build/_configuration.adoc b/src/main/asciidoc/inc/build/_configuration.adoc
index 98d01b178..53844d74c 100644
--- a/src/main/asciidoc/inc/build/_configuration.adoc
+++ b/src/main/asciidoc/inc/build/_configuration.adoc
@@ -121,7 +121,7 @@ a| Scan the archive specified in `dockerArchive` and find the actual repository
| Shell to be used for the *runCmds*. It contains *arg* elements which are defining the executable and its params.
| *runCmds*
-| Commands to be run during the build process. It contains *run* elements which are passed to the shell. Whitespace is trimmed from each element and empty elements are ignored. The run commands are inserted right after the assembly and after *workdir* into the Dockerfile. This tag is not to be confused with the `` section for this image which specifies the runtime behaviour when starting containers.
+| Commands to be run during the build process. It contains *run* elements which are passed to the shell. You may also change user with a *user* element, but beware this will overwrite default user from the parent image, so you should supply a user for the image if you do. Whitespace is trimmed from each element and empty elements are ignored. The run commands are inserted right after the assembly and after *workdir* into the Dockerfile. This tag is not to be confused with the `` section for this image which specifies the runtime behaviour when starting containers.
| *skip*
| if set to true disables building of the image. This config option is best used together with a maven property
@@ -181,6 +181,8 @@ remote API.
groupadd -r appUser
useradd -r -g appUser appUser
+ appUserid
diff --git a/src/main/java/io/fabric8/maven/docker/BuildMojo.java b/src/main/java/io/fabric8/maven/docker/BuildMojo.java
index f703e4a0d..d175e1d64 100644
--- a/src/main/java/io/fabric8/maven/docker/BuildMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/BuildMojo.java
@@ -33,7 +33,7 @@
* @author roland
* @since 28.07.14
*/
-@Mojo(name = "build", defaultPhase = LifecyclePhase.INSTALL, requiresDependencyResolution = ResolutionScope.TEST)
+@Mojo(name = "build", defaultPhase = LifecyclePhase.INSTALL, requiresDependencyResolution = ResolutionScope.TEST, configurator = "fabric8-mojo-configurator")
public class BuildMojo extends AbstractBuildSupportMojo {
public static final String DMP_PLUGIN_DESCRIPTOR = "META-INF/maven/io.fabric8/dmp-plugin";
diff --git a/src/main/java/io/fabric8/maven/docker/CopyMojo.java b/src/main/java/io/fabric8/maven/docker/CopyMojo.java
index 084da749e..571b59911 100644
--- a/src/main/java/io/fabric8/maven/docker/CopyMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/CopyMojo.java
@@ -1,19 +1,5 @@
package io.fabric8.maven.docker;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Properties;
-import java.util.regex.Matcher;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-
import io.fabric8.maven.docker.access.DockerAccess;
import io.fabric8.maven.docker.config.CopyConfiguration;
import io.fabric8.maven.docker.config.CopyConfiguration.Entry;
@@ -28,6 +14,19 @@
import io.fabric8.maven.docker.util.ContainerNamingUtil;
import io.fabric8.maven.docker.util.GavLabel;
import io.fabric8.maven.docker.util.Logger;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+import java.util.regex.Matcher;
/**
* Mojo for copying file or directory from container.
@@ -41,7 +40,7 @@
* matching images configured in the project are searched and the copying is performed from the found containers
* only.
*/
-@Mojo(name = "copy", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST)
+@Mojo(name = "copy", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST, configurator = "fabric8-mojo-configurator")
public class CopyMojo extends AbstractDockerMojo {
private static final String COPY_NAME_PATTERN_CONFIG = "copyNamePattern";
diff --git a/src/main/java/io/fabric8/maven/docker/LogsMojo.java b/src/main/java/io/fabric8/maven/docker/LogsMojo.java
index 0562129ed..bf217d7f7 100644
--- a/src/main/java/io/fabric8/maven/docker/LogsMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/LogsMojo.java
@@ -24,7 +24,7 @@
* @since 26.03.14
*
*/
-@Mojo(name = "logs")
+@Mojo(name = "logs", configurator = "fabric8-mojo-configurator")
public class LogsMojo extends AbstractDockerMojo {
// Whether to log infinitely or to show only the logs happened until now.
diff --git a/src/main/java/io/fabric8/maven/docker/MojoConfigurator.java b/src/main/java/io/fabric8/maven/docker/MojoConfigurator.java
new file mode 100644
index 000000000..421dc39d5
--- /dev/null
+++ b/src/main/java/io/fabric8/maven/docker/MojoConfigurator.java
@@ -0,0 +1,46 @@
+package io.fabric8.maven.docker;
+
+import io.fabric8.maven.docker.assembly.DockerFileKeyword;
+import io.fabric8.maven.docker.config.RunCommand;
+import org.codehaus.plexus.component.configurator.BasicComponentConfigurator;
+import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
+import org.codehaus.plexus.component.configurator.ConfigurationListener;
+import org.codehaus.plexus.component.configurator.converters.ConfigurationConverter;
+import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
+import org.codehaus.plexus.configuration.PlexusConfiguration;
+
+import javax.inject.Named;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Configure a converter for runcmds that can be either USER or RUN with value as parameter
+ */
+
+@Named("fabric8-mojo-configurator")
+public class MojoConfigurator extends BasicComponentConfigurator {
+ private static final Set VALID_KEYWORDS = new HashSet<>(Arrays.asList("RUN", "USER"));
+
+ public MojoConfigurator() {
+ converterLookup.registerConverter(new ConfigurationConverter() {
+ @Override
+ public boolean canConvert(Class> aClass) {
+ return RunCommand.class == aClass;
+ }
+
+ @Override
+ public Object fromConfiguration(ConverterLookup converterLookup, PlexusConfiguration plexusConfiguration, Class> aClass, Class> aClass1, ClassLoader classLoader, ExpressionEvaluator expressionEvaluator) throws ComponentConfigurationException {
+ return fromConfiguration(converterLookup, plexusConfiguration, aClass, aClass1, classLoader, expressionEvaluator, null);
+ }
+
+ @Override
+ public Object fromConfiguration(ConverterLookup converterLookup, PlexusConfiguration plexusConfiguration, Class> aClass, Class> aClass1, ClassLoader classLoader, ExpressionEvaluator expressionEvaluator, ConfigurationListener configurationListener) throws ComponentConfigurationException {
+ String keyword = plexusConfiguration.getName().trim().toUpperCase();
+ if (!VALID_KEYWORDS.contains(keyword) || plexusConfiguration.getValue() == null) return null;
+ return new RunCommand(DockerFileKeyword.valueOf(keyword), plexusConfiguration.getValue().trim());
+ }
+ });
+ }
+}
diff --git a/src/main/java/io/fabric8/maven/docker/PushMojo.java b/src/main/java/io/fabric8/maven/docker/PushMojo.java
index 01acdab1a..d6af20b7b 100644
--- a/src/main/java/io/fabric8/maven/docker/PushMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/PushMojo.java
@@ -3,7 +3,6 @@
import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.service.JibBuildService;
import io.fabric8.maven.docker.service.ServiceHub;
-
import io.fabric8.maven.docker.util.MojoParameters;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
@@ -15,7 +14,7 @@
*
* @author roland
*/
-@Mojo(name = "push", defaultPhase = LifecyclePhase.DEPLOY)
+@Mojo(name = "push", defaultPhase = LifecyclePhase.DEPLOY, configurator = "fabric8-mojo-configurator")
public class PushMojo extends AbstractDockerMojo {
// Registry to use for push operations if no registry is specified
diff --git a/src/main/java/io/fabric8/maven/docker/RemoveMojo.java b/src/main/java/io/fabric8/maven/docker/RemoveMojo.java
index f93542b8a..ec09ca266 100644
--- a/src/main/java/io/fabric8/maven/docker/RemoveMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/RemoveMojo.java
@@ -20,7 +20,6 @@
import io.fabric8.maven.docker.service.QueryService;
import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.util.ImageName;
-
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
@@ -46,7 +45,7 @@
* @since 23.10.14
*
*/
-@Mojo(name = "remove", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST)
+@Mojo(name = "remove", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST, configurator = "fabric8-mojo-configurator")
public class RemoveMojo extends AbstractDockerMojo {
private static final String REMOVE_NAME_PATTERN_CONFIG = "removeNamePattern";
diff --git a/src/main/java/io/fabric8/maven/docker/RunMojo.java b/src/main/java/io/fabric8/maven/docker/RunMojo.java
index 70704f87b..c1d1d7029 100644
--- a/src/main/java/io/fabric8/maven/docker/RunMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/RunMojo.java
@@ -24,7 +24,7 @@
* @author roland
* @since 26/04/16
*/
-@Mojo(name = "run", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
+@Mojo(name = "run", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST, configurator = "fabric8-mojo-configurator")
public class RunMojo extends StartMojo {
@Override
diff --git a/src/main/java/io/fabric8/maven/docker/SaveMojo.java b/src/main/java/io/fabric8/maven/docker/SaveMojo.java
index d34281b6f..6687fd87f 100644
--- a/src/main/java/io/fabric8/maven/docker/SaveMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/SaveMojo.java
@@ -1,11 +1,9 @@
package io.fabric8.maven.docker;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
+import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.config.ArchiveCompression;
+import io.fabric8.maven.docker.config.ImageConfiguration;
+import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.util.EnvUtil;
import io.fabric8.maven.docker.util.ImageName;
import org.apache.maven.plugin.MojoExecutionException;
@@ -14,11 +12,12 @@
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProjectHelper;
-import io.fabric8.maven.docker.access.DockerAccessException;
-import io.fabric8.maven.docker.config.ImageConfiguration;
-import io.fabric8.maven.docker.service.ServiceHub;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
-@Mojo(name = "save")
+@Mojo(name = "save", configurator = "fabric8-mojo-configurator")
public class SaveMojo extends AbstractDockerMojo {
// Used when not automatically determined
diff --git a/src/main/java/io/fabric8/maven/docker/SourceMojo.java b/src/main/java/io/fabric8/maven/docker/SourceMojo.java
index 93c226a84..b7424e029 100644
--- a/src/main/java/io/fabric8/maven/docker/SourceMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/SourceMojo.java
@@ -16,17 +16,12 @@
* limitations under the License.
*/
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.config.BuildImageConfiguration;
-import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.config.BuildImageSelectMode;
+import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.util.MojoParameters;
-
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
@@ -34,6 +29,10 @@
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProjectHelper;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Mojo for attaching one more source docker tar file to an artifact.
*
@@ -44,7 +43,7 @@
* @author roland
* @since 25/10/15
*/
-@Mojo(name = "source", defaultPhase = LifecyclePhase.PACKAGE)
+@Mojo(name = "source", defaultPhase = LifecyclePhase.PACKAGE, configurator = "fabric8-mojo-configurator")
public class SourceMojo extends AbstractBuildSupportMojo {
@Component
diff --git a/src/main/java/io/fabric8/maven/docker/StartMojo.java b/src/main/java/io/fabric8/maven/docker/StartMojo.java
index e19249e18..49030460c 100644
--- a/src/main/java/io/fabric8/maven/docker/StartMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/StartMojo.java
@@ -8,22 +8,6 @@
* the License.
*/
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorCompletionService;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
import com.google.common.util.concurrent.MoreExecutors;
import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.access.ExecException;
@@ -46,13 +30,29 @@
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
+import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorCompletionService;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
/**
* Goal for creating and starting a docker container. This goal evaluates the image configuration
*
* @author roland
*/
-@Mojo(name = "start", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
+@Mojo(name = "start", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST, configurator = "fabric8-mojo-configurator")
public class StartMojo extends AbstractDockerMojo {
@Parameter(property = "docker.showLogs")
diff --git a/src/main/java/io/fabric8/maven/docker/StopMojo.java b/src/main/java/io/fabric8/maven/docker/StopMojo.java
index 964ab89c9..194c3d9f2 100644
--- a/src/main/java/io/fabric8/maven/docker/StopMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/StopMojo.java
@@ -1,21 +1,5 @@
package io.fabric8.maven.docker;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-
import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.access.ExecException;
import io.fabric8.maven.docker.config.ImageConfiguration;
@@ -28,6 +12,21 @@
import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.util.ContainerNamingUtil;
import io.fabric8.maven.docker.util.GavLabel;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
/**
@@ -43,7 +42,7 @@
* @since 26.03.14
*
*/
-@Mojo(name = "stop", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST)
+@Mojo(name = "stop", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST, configurator = "fabric8-mojo-configurator")
public class StopMojo extends AbstractDockerMojo {
private static final String STOP_NAME_PATTERN_CONFIG = "stopNamePattern";
diff --git a/src/main/java/io/fabric8/maven/docker/TagMojo.java b/src/main/java/io/fabric8/maven/docker/TagMojo.java
index 992d6f870..b672371ff 100644
--- a/src/main/java/io/fabric8/maven/docker/TagMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/TagMojo.java
@@ -15,7 +15,7 @@
* Goal for Tagging an image so that it becomes part of a repository.
*
*/
-@Mojo(name = "tag", defaultPhase = LifecyclePhase.INSTALL)
+@Mojo(name = "tag", defaultPhase = LifecyclePhase.INSTALL, configurator = "fabric8-mojo-configurator")
public class TagMojo extends AbstractDockerMojo {
@Parameter(property = "docker.skip.tag", defaultValue = "false")
private boolean skipTag;
diff --git a/src/main/java/io/fabric8/maven/docker/VolumeCreateMojo.java b/src/main/java/io/fabric8/maven/docker/VolumeCreateMojo.java
index f437e699f..76da29971 100644
--- a/src/main/java/io/fabric8/maven/docker/VolumeCreateMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/VolumeCreateMojo.java
@@ -15,7 +15,7 @@
* @author Tom Burton
* @version Dec 15, 2016
*/
-@Mojo(name = "volume-create", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
+@Mojo(name = "volume-create", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST, configurator = "fabric8-mojo-configurator")
public class VolumeCreateMojo extends AbstractDockerMojo {
@Override
diff --git a/src/main/java/io/fabric8/maven/docker/VolumeRemoveMojo.java b/src/main/java/io/fabric8/maven/docker/VolumeRemoveMojo.java
index 6b0976665..bcb40c385 100644
--- a/src/main/java/io/fabric8/maven/docker/VolumeRemoveMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/VolumeRemoveMojo.java
@@ -5,7 +5,6 @@
import io.fabric8.maven.docker.config.VolumeConfiguration;
import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.service.VolumeService;
-
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
@@ -15,7 +14,7 @@
*
* @author Tom Burton
*/
-@Mojo(name = "volume-remove", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST)
+@Mojo(name = "volume-remove", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST, configurator = "fabric8-mojo-configurator")
public class VolumeRemoveMojo extends AbstractDockerMojo {
@Override
diff --git a/src/main/java/io/fabric8/maven/docker/WatchMojo.java b/src/main/java/io/fabric8/maven/docker/WatchMojo.java
index 04d4c0d64..43783179e 100644
--- a/src/main/java/io/fabric8/maven/docker/WatchMojo.java
+++ b/src/main/java/io/fabric8/maven/docker/WatchMojo.java
@@ -15,8 +15,6 @@
* limitations under the License.
*/
-import java.io.IOException;
-
import io.fabric8.maven.docker.config.WatchMode;
import io.fabric8.maven.docker.service.BuildService;
import io.fabric8.maven.docker.service.ServiceHub;
@@ -26,6 +24,8 @@
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
+import java.io.IOException;
+
/**
* Mojo for watching source code changes.
*
@@ -40,7 +40,7 @@
* @author roland
* @since 16/06/15
*/
-@Mojo(name = "watch")
+@Mojo(name = "watch", configurator = "fabric8-mojo-configurator")
public class WatchMojo extends AbstractBuildSupportMojo {
/**
@@ -112,4 +112,4 @@ private String showLogs() {
private boolean follow() {
return Boolean.valueOf(System.getProperty("docker.follow", "false"));
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/io/fabric8/maven/docker/assembly/DockerFileBuilder.java b/src/main/java/io/fabric8/maven/docker/assembly/DockerFileBuilder.java
index 1560ccac5..816fac615 100644
--- a/src/main/java/io/fabric8/maven/docker/assembly/DockerFileBuilder.java
+++ b/src/main/java/io/fabric8/maven/docker/assembly/DockerFileBuilder.java
@@ -1,17 +1,23 @@
package io.fabric8.maven.docker.assembly;
+import com.google.common.base.Joiner;
+import io.fabric8.maven.docker.config.Arguments;
+import io.fabric8.maven.docker.config.HealthCheckConfiguration;
+import io.fabric8.maven.docker.config.RunCommand;
+import org.codehaus.plexus.util.FileUtils;
+
import java.io.File;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
-import com.google.common.base.Joiner;
-import io.fabric8.maven.docker.config.Arguments;
-import io.fabric8.maven.docker.config.HealthCheckConfiguration;
-
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.StringUtils;
+import static io.fabric8.maven.docker.assembly.DockerFileKeyword.RUN;
+import static io.fabric8.maven.docker.assembly.DockerFileKeyword.USER;
/**
* Create a dockerfile
@@ -62,7 +68,7 @@ public class DockerFileBuilder {
private Arguments shell;
// list of RUN Commands to run along with image build see issue #191 on github
- private List runCmds = new ArrayList<>();
+ private List runCmds = new ArrayList<>();
// environment
private Map envEntries = new LinkedHashMap<>();
@@ -127,7 +133,7 @@ public String content() throws IllegalArgumentException {
private void addUser(StringBuilder b) {
if (user != null) {
- DockerFileKeyword.USER.addTo(b, user);
+ USER.addTo(b, user);
}
}
@@ -213,13 +219,13 @@ private void addCopy(StringBuilder b) {
if (entryUser != null) {
String[] userParts = entryUser.split(":");
if (userParts.length > 2) {
- DockerFileKeyword.USER.addTo(b, "root");
+ USER.addTo(b, "root");
}
addCopyEntries(b, entry, "", (userParts.length > 1 ?
userParts[0] + ":" + userParts[1] :
userParts[0]));
if (userParts.length > 2) {
- DockerFileKeyword.USER.addTo(b, userParts[2]);
+ USER.addTo(b, userParts[2]);
}
} else {
addCopyEntries(b, entry, "", null);
@@ -323,9 +329,13 @@ private String validatePortExposure(String input) throws IllegalArgumentExceptio
private void addOptimisation() {
if (runCmds != null && !runCmds.isEmpty() && shouldOptimise) {
- String optimisedRunCmd = StringUtils.join(runCmds.iterator(), " && ");
+ if(runCmds.stream().map(RunCommand::getAction).anyMatch(USER::equals)) return;
+ String commands = runCmds.stream()
+ .filter(rc -> rc.getAction() == RUN)
+ .map(r -> r.getParams())
+ .collect(Collectors.joining(" && "));
runCmds.clear();
- runCmds.add(optimisedRunCmd);
+ runCmds.add(new RunCommand(commands));
}
}
@@ -336,8 +346,8 @@ private void addShell(StringBuilder b) {
}
private void addRun(StringBuilder b) {
- for (String run : runCmds) {
- DockerFileKeyword.RUN.addTo(b, run);
+ for (RunCommand run : runCmds) {
+ if(run != null) run.getAction().addTo(b, run.getParams());
}
}
@@ -456,14 +466,8 @@ public DockerFileBuilder shell(Arguments shell) {
* @param runCmds
* @return
*/
- public DockerFileBuilder run(List runCmds) {
- if (runCmds != null) {
- for (String cmd : runCmds) {
- if (!StringUtils.isEmpty(cmd)) {
- this.runCmds.add(cmd);
- }
- }
- }
+ public DockerFileBuilder run(List runCmds) {
+ if(runCmds != null) this.runCmds.addAll(runCmds);
return this;
}
diff --git a/src/main/java/io/fabric8/maven/docker/config/BuildImageConfiguration.java b/src/main/java/io/fabric8/maven/docker/config/BuildImageConfiguration.java
index 7c378851a..17e1bd8b1 100644
--- a/src/main/java/io/fabric8/maven/docker/config/BuildImageConfiguration.java
+++ b/src/main/java/io/fabric8/maven/docker/config/BuildImageConfiguration.java
@@ -1,5 +1,12 @@
package io.fabric8.maven.docker.config;
+import io.fabric8.maven.docker.util.DeepCopy;
+import io.fabric8.maven.docker.util.EnvUtil;
+import io.fabric8.maven.docker.util.Logger;
+import io.fabric8.maven.docker.util.MojoParameters;
+import org.apache.maven.plugins.annotations.Parameter;
+
+import javax.annotation.Nonnull;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
@@ -14,15 +21,6 @@
import java.util.Set;
import java.util.stream.Collectors;
-import javax.annotation.Nonnull;
-
-import org.apache.maven.plugins.annotations.Parameter;
-
-import io.fabric8.maven.docker.util.DeepCopy;
-import io.fabric8.maven.docker.util.EnvUtil;
-import io.fabric8.maven.docker.util.Logger;
-import io.fabric8.maven.docker.util.MojoParameters;
-
/**
* @author roland
* @since 02.09.14
@@ -123,7 +121,7 @@ public class BuildImageConfiguration implements Serializable {
* RUN Commands within Build/Image
*/
@Parameter
- private List runCmds;
+ private List runCmds;
@Parameter
private String cleanup;
@@ -462,8 +460,8 @@ public Arguments getShell() {
}
@Nonnull
- public List getRunCmds() {
- return EnvUtil.removeEmptyEntries(runCmds);
+ public List getRunCmds() {
+ return runCmds;
}
public String getUser() {
@@ -631,7 +629,7 @@ public Builder shell(Arguments shell) {
return this;
}
- public Builder runCmds(List theCmds) {
+ public Builder runCmds(List theCmds) {
if (theCmds == null) {
config.runCmds = new ArrayList<>();
} else {
@@ -872,4 +870,5 @@ private File findDockerFileFile(Logger log) {
// No dockerfile mode
return null;
}
+
}
diff --git a/src/main/java/io/fabric8/maven/docker/config/RunCommand.java b/src/main/java/io/fabric8/maven/docker/config/RunCommand.java
new file mode 100644
index 000000000..4f9b8cfa5
--- /dev/null
+++ b/src/main/java/io/fabric8/maven/docker/config/RunCommand.java
@@ -0,0 +1,65 @@
+package io.fabric8.maven.docker.config;
+
+import io.fabric8.maven.docker.assembly.DockerFileKeyword;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class RunCommand implements Serializable {
+ protected DockerFileKeyword action;
+ protected String params;
+
+ public RunCommand() {
+ }
+
+ public RunCommand(String cmd) {
+ this(DockerFileKeyword.RUN, cmd);
+ }
+
+ public RunCommand(DockerFileKeyword action, String param) {
+ this.action = action;
+ this.params = param;
+ }
+
+ public static List run(String... commands) {
+ return Arrays.stream(commands).map(RunCommand::new).collect(Collectors.toList());
+ }
+
+ public DockerFileKeyword getAction() {
+ return action;
+ }
+
+ public String getParams() {
+ return params;
+ }
+
+ public void set(RunCommand rc) {
+ if(rc == null) return;
+ action = rc.action;
+ params = rc.params;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ RunCommand that = (RunCommand) o;
+ return action == that.action && Objects.equals(params, that.params);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(action, params);
+ }
+
+ @Override
+ public String toString() {
+ return "RunCommand{" +
+ "action=" + action +
+ ", params='" + params + '\'' +
+ '}';
+ }
+}
diff --git a/src/main/java/io/fabric8/maven/docker/config/RunCommandParam.java b/src/main/java/io/fabric8/maven/docker/config/RunCommandParam.java
new file mode 100644
index 000000000..b8d62084e
--- /dev/null
+++ b/src/main/java/io/fabric8/maven/docker/config/RunCommandParam.java
@@ -0,0 +1,45 @@
+package io.fabric8.maven.docker.config;
+
+import io.fabric8.maven.docker.assembly.DockerFileKeyword;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class RunCommandParam implements Serializable {
+ protected DockerFileKeyword action;
+ protected String params;
+
+ public RunCommandParam(DockerFileKeyword action, String param) {
+ this.action = action;
+ this.params = param;
+ }
+
+ public DockerFileKeyword getAction() {
+ return action;
+ }
+
+ public String getParams() {
+ return params;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ RunCommandParam that = (RunCommandParam) o;
+ return action == that.action && Objects.equals(params, that.params);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(action, params);
+ }
+
+ @Override
+ public String toString() {
+ return "RunCommandParam{" +
+ "action=" + action +
+ ", params='" + params + '\'' +
+ '}';
+ }
+}
diff --git a/src/main/java/io/fabric8/maven/docker/config/handler/property/PropertyConfigHandler.java b/src/main/java/io/fabric8/maven/docker/config/handler/property/PropertyConfigHandler.java
index 366e8f5e6..0de128393 100644
--- a/src/main/java/io/fabric8/maven/docker/config/handler/property/PropertyConfigHandler.java
+++ b/src/main/java/io/fabric8/maven/docker/config/handler/property/PropertyConfigHandler.java
@@ -15,17 +15,9 @@
* limitations under the License.
*/
-import io.fabric8.maven.docker.config.AttestationConfiguration;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.function.Supplier;
-
import io.fabric8.maven.docker.config.Arguments;
import io.fabric8.maven.docker.config.AssemblyConfiguration;
+import io.fabric8.maven.docker.config.AttestationConfiguration;
import io.fabric8.maven.docker.config.BuildImageConfiguration;
import io.fabric8.maven.docker.config.BuildXConfiguration;
import io.fabric8.maven.docker.config.CopyConfiguration;
@@ -45,7 +37,148 @@
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.CollectionUtils;
-import static io.fabric8.maven.docker.config.handler.property.ConfigKey.*;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.function.Supplier;
+
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ALIAS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ARGS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLIES;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_BASEDIR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_DESCRIPTOR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_DESCRIPTOR_REF;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_DOCKER_FILE_DIR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_EXPORT_BASEDIR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_IGNORE_PERMISSIONS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_MODE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_NAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_PERMISSIONS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_TARLONGFILEMODE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ASSEMBLY_USER;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.AUTO_REMOVE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BIND;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_ATTESTATION_PROVENANCE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_ATTESTATION_SBOM;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_BUILDERNAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_CACHE_FROM;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_CACHE_TO;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_CONFIGFILE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_DOCKERSTATEDIR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_NODENAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILDX_PLATFORMS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILD_NETWORK;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.BUILD_OPTIONS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CACHE_FROM;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CAP_ADD;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CAP_DROP;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CLEANUP;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CMD;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CONTEXT_DIR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.COPY_ENTRIES;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.COPY_NAME_PATTERN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CPUS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CPUSET;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.CPUSHARES;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.DEPENDS_ON;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.DNS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.DNS_SEARCH;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.DOCKER_ARCHIVE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.DOCKER_FILE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.DOCKER_FILE_DIR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.DOMAINNAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ENTRYPOINT;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ENV;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ENV_BUILD;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ENV_PROPERTY_FILE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ENV_RUN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.EXPOSED_PROPERTY_KEY;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.EXTRA_HOSTS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.FILTER;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.FROM;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.FROM_EXT;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.HEALTHCHECK;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.HEALTHCHECK_CMD;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.HEALTHCHECK_INTERVAL;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.HEALTHCHECK_MODE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.HEALTHCHECK_RETRIES;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.HEALTHCHECK_START_PERIOD;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.HEALTHCHECK_TIMEOUT;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.HOSTNAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.IMAGE_PULL_POLICY_BUILD;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.IMAGE_PULL_POLICY_RUN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.ISOLATION;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LABELS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LINKS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LOAD_NAME_PATTERN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LOG_COLOR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LOG_DATE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LOG_DRIVER_NAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LOG_DRIVER_OPTS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LOG_ENABLED;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LOG_FILE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.LOG_PREFIX;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.MAINTAINER;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.MEMORY;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.MEMORY_SWAP;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.NAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.NAMING_STRATEGY;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.NET;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.NETWORK_ALIAS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.NETWORK_MODE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.NETWORK_NAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.NO_CACHE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.OPTIMISE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.PLATFORM;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.PORTS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.PORT_PROPERTY_FILE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.PRIVILEGED;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.READ_ONLY;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.REGISTRY;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.REMOVE_NAME_PATTERN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.RESTART_POLICY_NAME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.RESTART_POLICY_RETRY;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.RUN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.SECURITY_OPTS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.SHELL;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.SHMSIZE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.SKIP_BUILD;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.SKIP_PUSH;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.SKIP_RUN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.SQUASH;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.STOP_NAME_PATTERN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.SYSCTLS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.TAGS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.TMPFS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.USER;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.USE_DEFAULT_EXCLUDES;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.VOLUMES;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.VOLUMES_FROM;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_EXEC_BREAK_ON_ERROR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_EXEC_POST_START;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_EXEC_PRE_STOP;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_EXIT;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_HEALTHY;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_HTTP_METHOD;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_HTTP_STATUS;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_HTTP_URL;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_KILL;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_LOG;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_SHUTDOWN;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_TCP_HOST;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_TCP_MODE;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_TCP_PORT;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_TIME;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WAIT_URL;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WATCH_INTERVAL;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WATCH_POSTEXEC;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WATCH_POSTGOAL;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WORKDIR;
+import static io.fabric8.maven.docker.config.handler.property.ConfigKey.WORKING_DIR;
/**
* @author roland
@@ -163,7 +296,7 @@ private BuildImageConfiguration extractBuildConfiguration(ImageConfiguration fro
.labels(valueProvider.getMap(LABELS, config.getLabels()))
.ports(extractPortValues(config.getPorts(), valueProvider))
.shell(extractArguments(valueProvider, SHELL, config.getShell()))
- .runCmds(valueProvider.getList(RUN, config.getRunCmds()))
+ .runCmds(valueProvider.getRunCommands(RUN, config.getRunCmds()))
.from(valueProvider.getString(FROM, config.getFrom()))
.fromExt(valueProvider.getMap(FROM_EXT, config.getFromExt()))
.registry(valueProvider.getString(REGISTRY, config.getRegistry()))
diff --git a/src/main/java/io/fabric8/maven/docker/config/handler/property/ValueProvider.java b/src/main/java/io/fabric8/maven/docker/config/handler/property/ValueProvider.java
index f0c9edc88..2acb6fd84 100644
--- a/src/main/java/io/fabric8/maven/docker/config/handler/property/ValueProvider.java
+++ b/src/main/java/io/fabric8/maven/docker/config/handler/property/ValueProvider.java
@@ -1,10 +1,20 @@
package io.fabric8.maven.docker.config.handler.property;
-import java.util.*;
-
+import io.fabric8.maven.docker.config.RunCommand;
import io.fabric8.maven.docker.util.EnvUtil;
-import static io.fabric8.maven.docker.util.EnvUtil.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
+import static io.fabric8.maven.docker.util.EnvUtil.extractFromPropertiesAsList;
+import static io.fabric8.maven.docker.util.EnvUtil.extractFromPropertiesAsListOfProperties;
+import static io.fabric8.maven.docker.util.EnvUtil.extractFromPropertiesAsMap;
/**
* Helper to extract values from a set of Properties, potentially mixing it up with XML-based configuration based on the
@@ -100,6 +110,15 @@ public List getList(ConfigKey key, List fromConfig) {
return stringListValueExtractor.getFromPreferredSource(prefix, key, fromConfig);
}
+ public List getRunCommands(ConfigKey key, List fromConfig) {
+ return new ListValueExtractor() {
+ @Override
+ protected List process(List strings) {
+ return strings.stream().map(RunCommand::new).collect(Collectors.toList());
+ }
+ }.getFromPreferredSource(prefix, key, fromConfig);
+ }
+
public List getIntList(ConfigKey key, List fromConfig) {
return intListValueExtractor.getFromPreferredSource(prefix, key, fromConfig);
}
diff --git a/src/main/java/io/fabric8/maven/docker/util/AuthConfigFactory.java b/src/main/java/io/fabric8/maven/docker/util/AuthConfigFactory.java
index 1b69850dc..b401145d3 100644
--- a/src/main/java/io/fabric8/maven/docker/util/AuthConfigFactory.java
+++ b/src/main/java/io/fabric8/maven/docker/util/AuthConfigFactory.java
@@ -1,26 +1,12 @@
package io.fabric8.maven.docker.util;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
+import com.google.common.net.UrlEscapers;
+import com.google.gson.Gson;
import com.google.gson.JsonObject;
-
-import java.lang.reflect.Method;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
+import io.fabric8.maven.docker.access.AuthConfig;
import io.fabric8.maven.docker.access.AuthConfigList;
+import io.fabric8.maven.docker.access.ecr.EcrExtendedAuth;
+import io.fabric8.maven.docker.util.aws.AwsSdkAuthConfigFactory;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
@@ -34,16 +20,24 @@
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
-
-import com.google.common.net.UrlEscapers;
-import com.google.gson.Gson;
-import io.fabric8.maven.docker.access.AuthConfig;
-import io.fabric8.maven.docker.access.ecr.EcrExtendedAuth;
-import io.fabric8.maven.docker.util.aws.AwsSdkAuthConfigFactory;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Factory for creating docker specific authentication configuration
@@ -669,18 +663,19 @@ private Server checkForServer(Server server, String id, String registry, String
}
private String decrypt(String password) throws MojoExecutionException {
- try {
- // Done by reflection since I have classloader issues otherwise
- Object secDispatcher = container.lookup(SecDispatcher.ROLE, "maven");
- Method method = secDispatcher.getClass().getMethod("decrypt",String.class);
- synchronized(secDispatcher) {
- return (String) method.invoke(secDispatcher, password);
- }
- } catch (ComponentLookupException e) {
- throw new MojoExecutionException("Error looking security dispatcher",e);
- } catch (ReflectiveOperationException e) {
- throw new MojoExecutionException("Cannot decrypt password: " + e.getCause(),e);
- }
+// try {
+// // Done by reflection since I have classloader issues otherwise
+// Object secDispatcher = container.lookup(SecDispatcher.ROLE, "maven");
+// Method method = secDispatcher.getClass().getMethod("decrypt",String.class);
+// synchronized(secDispatcher) {
+// return (String) method.invoke(secDispatcher, password);
+// }
+// } catch (ComponentLookupException e) {
+// throw new MojoExecutionException("Error looking security dispatcher",e);
+// } catch (ReflectiveOperationException e) {
+// throw new MojoExecutionException("Cannot decrypt password: " + e.getCause(),e);
+// }
+ return password;
}
private AuthConfig createAuthConfigFromServer(Server server) throws MojoExecutionException {
diff --git a/src/test/java/io/fabric8/maven/docker/PushMojoBuildXTest.java b/src/test/java/io/fabric8/maven/docker/PushMojoBuildXTest.java
index 3e79ca19a..c1237ca5f 100644
--- a/src/test/java/io/fabric8/maven/docker/PushMojoBuildXTest.java
+++ b/src/test/java/io/fabric8/maven/docker/PushMojoBuildXTest.java
@@ -76,7 +76,7 @@ void setup() throws MojoExecutionException, MojoFailureException, IOException, C
when(mavenProject.getBuild().getOutputDirectory()).thenReturn(targetDir.getAbsolutePath());
when(mavenProject.getBasedir()).thenReturn(temporaryFolder);
when(dockerAccessFactory.createDockerAccess(any())).thenReturn(dockerAccess);
- when(mockedPlexusContainer.lookup(SecDispatcher.ROLE, "maven")).thenReturn(mockedSecDispatcher);
+// when(mockedPlexusContainer.lookup(SecDispatcher.ROLE, "maven")).thenReturn(mockedSecDispatcher);
when(mockedSecDispatcher.decrypt(anyString())).thenReturn("testpassword");
Map pluginContext = new HashMap<>();
defaultExecMockedConstruction = mockConstruction(BuildXService.DefaultExec.class);
diff --git a/src/test/java/io/fabric8/maven/docker/assembly/DockerFileBuilderTest.java b/src/test/java/io/fabric8/maven/docker/assembly/DockerFileBuilderTest.java
index 615a4d5a1..ad15739f8 100644
--- a/src/test/java/io/fabric8/maven/docker/assembly/DockerFileBuilderTest.java
+++ b/src/test/java/io/fabric8/maven/docker/assembly/DockerFileBuilderTest.java
@@ -1,14 +1,23 @@
package io.fabric8.maven.docker.assembly;
-import java.io.IOException;
-import java.util.*;
-import java.util.regex.Pattern;
-
-import io.fabric8.maven.docker.config.*;
import com.google.common.collect.ImmutableMap;
+import io.fabric8.maven.docker.config.Arguments;
+import io.fabric8.maven.docker.config.HealthCheckConfiguration;
+import io.fabric8.maven.docker.config.HealthCheckMode;
+import io.fabric8.maven.docker.config.RunCommand;
import org.apache.commons.io.IOUtils;
-import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.regex.Pattern;
class DockerFileBuilderTest {
@@ -27,12 +36,37 @@ void testBuildDockerFile() throws Exception {
.labels(ImmutableMap.of("com.acme.foobar", "How are \"you\" ?"))
.volumes(Collections.singletonList("/vol1"))
.shell(b)
- .run(Arrays.asList("echo something", "echo second"))
+ .run(RunCommand.run("echo something", "echo second"))
.content();
String expected = loadFile("docker/Dockerfile.test");
Assertions.assertEquals(expected, stripCR(dockerfileContent));
}
+ @Test
+ void testBuildDockerFileUserChange() throws IOException {
+ Arguments a = Arguments.Builder.get().withParam("c1").withParam("c2").build();
+ Arguments b = Arguments.Builder.get().withParam("/bin/sh").withParam("-c").build();
+ String dockerfileContent = new DockerFileBuilder().add("/src", "/dest")
+ .baseImage("image")
+ .cmd(a)
+ .env(ImmutableMap.of("foo", "bar"))
+ .basedir("/export")
+ .expose(Collections.singletonList("8080"))
+ .maintainer("maintainer@example.com")
+ .workdir("/tmp")
+ .labels(ImmutableMap.of("com.acme.foobar", "How are \"you\" ?"))
+ .volumes(Collections.singletonList("/vol1"))
+ .shell(b)
+ .run(Arrays.asList(
+ new RunCommand(DockerFileKeyword.USER, "root"),
+ new RunCommand("echo something"),
+ new RunCommand(DockerFileKeyword.USER, "notroot"),
+ new RunCommand("echo second")))
+ .content();
+ String expected = loadFile("docker/Dockerfile_user_change.test");
+ Assertions.assertEquals(expected, stripCR(dockerfileContent));
+ }
+
@Test
void testBuildDockerShellArgumentsForShell() throws Exception {
Arguments a = Arguments.Builder.get().withParam("c1").withParam("c2").build();
@@ -48,7 +82,7 @@ void testBuildDockerShellArgumentsForShell() throws Exception {
.labels(ImmutableMap.of("com.acme.foobar", "How are \"you\" ?"))
.volumes(Collections.singletonList("/vol1"))
.shell(b)
- .run(Arrays.asList("echo something", "echo second"))
+ .run(RunCommand.run("echo something", "echo second"))
.content();
String expected = loadFile("docker/Dockerfile.test");
Assertions.assertEquals(expected, stripCR(dockerfileContent));
@@ -89,7 +123,7 @@ void testBuildDockerFileUDPPort() throws IOException {
.maintainer("maintainer@example.com")
.workdir("/tmp")
.volumes(Collections.singletonList("/vol1"))
- .run(Arrays.asList("echo something", "echo second"))
+ .run(RunCommand.run("echo something", "echo second"))
.content();
String expected = loadFile("docker/Dockerfile_udp.test");
Assertions.assertEquals(expected, stripCR(dockerfileContent));
@@ -106,7 +140,7 @@ void testBuildDockerFileExplicitTCPPort() throws IOException {
.maintainer("maintainer@example.com")
.workdir("/tmp")
.volumes(Collections.singletonList("/vol1"))
- .run(Arrays.asList("echo something", "echo second"))
+ .run(RunCommand.run("echo something", "echo second"))
.content();
String expected = loadFile("docker/Dockerfile_tcp.test");
Assertions.assertEquals(expected, stripCR(dockerfileContent));
@@ -123,7 +157,7 @@ private static DockerFileBuilder getFileBuilder() {
.workdir("/tmp")
.labels(ImmutableMap.of("com.acme.foobar", "How are \"you\" ?"))
.volumes(Collections.singletonList("/vol1"))
- .run(Arrays.asList("echo something", "echo second"));
+ .run(RunCommand.run("echo something", "echo second"));
return builder;
}
@@ -143,7 +177,7 @@ void testBuildDockerFileBadProtocol() {
void testDockerFileOptimisation() throws Exception {
String dockerfileContent = getFileBuilder()
.expose(Collections.singletonList("8080"))
- .run(Arrays.asList("echo third", "echo fourth", "echo fifth"))
+ .run(RunCommand.run("echo third", "echo fourth", "echo fifth"))
.optimise()
.content();
String expected = loadFile("docker/Dockerfile_optimised.test");
@@ -158,7 +192,7 @@ void testMaintainer() {
@Test
void testOptimise() {
- String dockerfileContent = new DockerFileBuilder().optimise().run(Arrays.asList("echo something", "echo two")).content();
+ String dockerfileContent = new DockerFileBuilder().optimise().run(RunCommand.run("echo something", "echo two")).content();
Assertions.assertEquals("echo something && echo two", dockerfileToMap(dockerfileContent).get("RUN"));
}
diff --git a/src/test/java/io/fabric8/maven/docker/config/handler/property/PropertyConfigHandlerTest.java b/src/test/java/io/fabric8/maven/docker/config/handler/property/PropertyConfigHandlerTest.java
index 5f0686982..09c674af8 100644
--- a/src/test/java/io/fabric8/maven/docker/config/handler/property/PropertyConfigHandlerTest.java
+++ b/src/test/java/io/fabric8/maven/docker/config/handler/property/PropertyConfigHandlerTest.java
@@ -25,12 +25,11 @@
import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.config.LogConfiguration;
import io.fabric8.maven.docker.config.RestartPolicy;
+import io.fabric8.maven.docker.config.RunCommand;
import io.fabric8.maven.docker.config.RunImageConfiguration;
import io.fabric8.maven.docker.config.UlimitConfig;
import io.fabric8.maven.docker.config.WaitConfiguration;
import io.fabric8.maven.docker.config.handler.AbstractConfigHandlerTest;
-import io.fabric8.maven.docker.util.Logger;
-
import org.apache.maven.plugins.assembly.model.Assembly;
import org.apache.maven.plugins.assembly.model.DependencySet;
import org.apache.maven.project.MavenProject;
@@ -195,8 +194,7 @@ imageConfiguration, props(
Assertions.assertEquals(1, configs.size());
BuildImageConfiguration buildConfig = configs.get(0).getBuildConfiguration();
- String[] runCommands = new ArrayList<>(buildConfig.getRunCmds()).toArray(new String[buildConfig.getRunCmds().size()]);
- Assertions.assertArrayEquals(new String[] { "foo", "bar", "wibble" }, runCommands);
+ Assertions.assertEquals(RunCommand.run( "foo", "bar", "wibble" ), buildConfig.getRunCmds());
}
@Test
@@ -220,7 +218,7 @@ void testRunCommandsFromPropertiesAndConfig() {
imageConfiguration = new ImageConfiguration.Builder()
.externalConfig(new HashMap<>())
.buildConfig(new BuildImageConfiguration.Builder()
- .runCmds(Arrays.asList("some", "ignored", "value"))
+ .runCmds(RunCommand.run("some", "ignored", "value"))
.cacheFrom((Collections.singletonList("foo/bar:latest")))
.build()
)
@@ -240,8 +238,7 @@ imageConfiguration, props(
Assertions.assertEquals(1, configs.size());
BuildImageConfiguration buildConfig = configs.get(0).getBuildConfiguration();
- String[] runCommands = new ArrayList<>(buildConfig.getRunCmds()).toArray(new String[buildConfig.getRunCmds().size()]);
- Assertions.assertArrayEquals(new String[] { "propconf", "withrun", "used" }, runCommands);
+ Assertions.assertEquals(RunCommand.run("propconf", "withrun", "used"), buildConfig.getRunCmds());
}
@Test
@@ -276,7 +273,7 @@ void testRunCommandsFromConfigAndProperties() {
imageConfiguration = new ImageConfiguration.Builder()
.externalConfig(externalConfigMode(PropertyMode.Fallback))
.buildConfig(new BuildImageConfiguration.Builder()
- .runCmds(Arrays.asList("some", "configured", "value"))
+ .runCmds(RunCommand.run("some", "configured", "value"))
.cacheFrom((Collections.singletonList("foo/bar:latest")))
.build()
)
@@ -294,8 +291,7 @@ imageConfiguration, props(
Assertions.assertEquals(1, configs.size());
BuildImageConfiguration buildConfig = configs.get(0).getBuildConfiguration();
- String[] runCommands = new ArrayList<>(buildConfig.getRunCmds()).toArray(new String[buildConfig.getRunCmds().size()]);
- Assertions.assertArrayEquals(new String[] { "some", "configured", "value" }, runCommands);
+ Assertions.assertEquals(RunCommand.run("some", "configured", "value"), buildConfig.getRunCmds());
}
@Test
diff --git a/src/test/java/io/fabric8/maven/docker/service/RegistryServiceTest.java b/src/test/java/io/fabric8/maven/docker/service/RegistryServiceTest.java
index 86cf2e168..787755c8c 100644
--- a/src/test/java/io/fabric8/maven/docker/service/RegistryServiceTest.java
+++ b/src/test/java/io/fabric8/maven/docker/service/RegistryServiceTest.java
@@ -11,6 +11,7 @@
import io.fabric8.maven.docker.config.ImagePullPolicy;
import io.fabric8.maven.docker.util.AuthConfigFactory;
import io.fabric8.maven.docker.util.AutoPullMode;
+import io.fabric8.maven.docker.util.DockerFileUtil;
import io.fabric8.maven.docker.util.ImageName;
import io.fabric8.maven.docker.util.Logger;
import io.fabric8.maven.docker.util.ProjectPaths;
@@ -24,6 +25,7 @@
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@@ -55,8 +57,9 @@ class RegistryServiceTest {
private TestCacheStore cacheStore;
private AutoPullMode autoPullMode;
private RegistryService registryService;
+ private boolean hasImage;
private Map authConfig;
-
+ private MockedStatic dockerFileUtilMockedStatic;
@TempDir
private File projectBaseDir;
@@ -93,6 +96,7 @@ void setup() {
imageName = null;
imagePullPolicy = null;
autoPullMode = null;
+ hasImage = false;
registry = null;
imageConfiguration = null;
}
@@ -103,6 +107,8 @@ void pullImagePullPolicyAlways(boolean hasImage) throws Exception {
givenAnImage();
givenAnImageConfiguration("myregistry.com/user/app:1.0.1");
givenImagePullPolicy(ImagePullPolicy.Always);
+ givenHasImage(hasImage);
+
checkPulledButNotTagged();
}
@@ -112,6 +118,8 @@ void pullImageAutopullAlways(boolean hasImage) throws Exception {
givenAnImage();
givenAnImageConfiguration("myregistry.com/user/app:1.0.1");
givenAutoPullMode(AutoPullMode.ALWAYS);
+ givenHasImage(hasImage);
+
checkPulledButNotTagged();
}
@@ -128,6 +136,7 @@ private void checkPulledButNotTagged() throws DockerAccessException {
void pullImageAlwaysWhenPreviouslyPulled() throws Exception {
givenAnImage();
givenAnImageConfiguration("myregistry.com/user/app:1.0.1");
+ givenHasImage(false);
givenPreviousPulled(true);
givenImagePullPolicy(ImagePullPolicy.Always);
@@ -158,6 +167,7 @@ void alreadyPulled() throws DockerAccessException {
@Test
void policyNeverWithImageAvailable() throws DockerAccessException {
givenAnImage();
+ givenHasImage(true);
givenPreviousPulled(false);
givenImagePullPolicy(ImagePullPolicy.Never);
@@ -171,6 +181,7 @@ void policyNeverWithImageAvailable() throws DockerAccessException {
@Test
void policyNeverWithImageNotAvailable() throws DockerAccessException {
givenAnImage();
+ givenHasImage(false);
givenAnImageConfiguration("myregistry.com/user/app:1.0.1");
givenPreviousPulled(false);
givenImagePullPolicy(ImagePullPolicy.Never);
@@ -191,10 +202,13 @@ private void thenExceptionThrown() {
void pullWithCustomRegistry() throws DockerAccessException {
givenAnImageConfiguration("myregistry.com/user/app:1.0.1");
givenAnImage("myregistry.com/user/test:1.0.1");
+ givenHasImage(false);
givenPreviousPulled(false);
givenRegistry("anotherRegistry.com");
givenImagePullPolicy(ImagePullPolicy.IfNotPresent);
+
whenAutoPullImage();
+
thenImageHasBeenPulledWithRegistry("myregistry.com");
thenImageHasNotBeenTagged();
thenNoExceptionThrown();
@@ -209,6 +223,7 @@ void pullImageWithPolicy_pullPolicyAlwaysAndBuildConfiguration_shouldPull() thro
.name("myregistry.com/user/app:1.0.1")
.buildConfig(buildImageConfiguration).build();
givenAnImage("myregistry.com/user/test:1.0.1");
+ givenHasImage(false);
givenPreviousPulled(false);
givenRegistry("anotherRegistry.com");
givenImagePullPolicy(ImagePullPolicy.Always);
@@ -233,6 +248,7 @@ void pullImageWithPolicy_pullPolicyAlwaysAndBuildConfiguration_shouldPull() thro
void tagForCustomRegistry() throws DockerAccessException {
givenAnImageConfiguration("myregistry.com/user/app:1.0.1");
givenAnImage("user/test:1.0.1");
+ givenHasImage(false);
givenPreviousPulled(false);
givenRegistry("anotherRegistry.com");
givenImagePullPolicy(ImagePullPolicy.IfNotPresent);
@@ -517,6 +533,9 @@ private void givenAutoPullMode(AutoPullMode autoPullMode) {
this.autoPullMode = autoPullMode;
}
+ private void givenHasImage(boolean hasImage) {
+ this.hasImage = hasImage;
+ }
private void givenPreviousPulled(boolean pulled) {
this.cacheStore.put("dummyKey", pulled ? "{ '" + imageName + "': true}" : null);
diff --git a/src/test/java/io/fabric8/maven/docker/util/AuthConfigFactoryTest.java b/src/test/java/io/fabric8/maven/docker/util/AuthConfigFactoryTest.java
index 695181067..aee14a00c 100644
--- a/src/test/java/io/fabric8/maven/docker/util/AuthConfigFactoryTest.java
+++ b/src/test/java/io/fabric8/maven/docker/util/AuthConfigFactoryTest.java
@@ -101,7 +101,7 @@ public String decrypt(String password) {
@BeforeEach
void containerSetup() throws ComponentLookupException, SecDispatcherException {
- Mockito.lenient().when(container.lookup(SecDispatcher.ROLE, "maven")).thenReturn(secDispatcher);
+// Mockito.lenient().when(container.lookup(SecDispatcher.ROLE, "maven")).thenReturn(secDispatcher);
Mockito.lenient().when(secDispatcher.decrypt(Mockito.anyString())).thenAnswer(invocation -> invocation.getArguments()[0]);
factory = new AuthConfigFactory(container);
diff --git a/src/test/resources/docker/Dockerfile_user_change.test b/src/test/resources/docker/Dockerfile_user_change.test
new file mode 100644
index 000000000..da0dac0b8
--- /dev/null
+++ b/src/test/resources/docker/Dockerfile_user_change.test
@@ -0,0 +1,14 @@
+FROM image
+MAINTAINER maintainer@example.com
+ENV foo=bar
+LABEL com.acme.foobar="How are \"you\" ?"
+EXPOSE 8080
+COPY /src /export/dest
+WORKDIR /tmp
+SHELL ["/bin/sh","-c"]
+USER root
+RUN echo something
+USER notroot
+RUN echo second
+VOLUME ["/vol1"]
+CMD ["c1","c2"]
From a04d0ecf931b51c75058b9c1b8172799e297c8bc Mon Sep 17 00:00:00 2001
From: Jens Andersen
Date: Thu, 11 Apr 2024 09:43:08 +0200
Subject: [PATCH 2/3] Removed unused class
Signed-off-by: Jens Andersen
---
.../maven/docker/config/RunCommandParam.java | 45 -------------------
1 file changed, 45 deletions(-)
delete mode 100644 src/main/java/io/fabric8/maven/docker/config/RunCommandParam.java
diff --git a/src/main/java/io/fabric8/maven/docker/config/RunCommandParam.java b/src/main/java/io/fabric8/maven/docker/config/RunCommandParam.java
deleted file mode 100644
index b8d62084e..000000000
--- a/src/main/java/io/fabric8/maven/docker/config/RunCommandParam.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package io.fabric8.maven.docker.config;
-
-import io.fabric8.maven.docker.assembly.DockerFileKeyword;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class RunCommandParam implements Serializable {
- protected DockerFileKeyword action;
- protected String params;
-
- public RunCommandParam(DockerFileKeyword action, String param) {
- this.action = action;
- this.params = param;
- }
-
- public DockerFileKeyword getAction() {
- return action;
- }
-
- public String getParams() {
- return params;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- RunCommandParam that = (RunCommandParam) o;
- return action == that.action && Objects.equals(params, that.params);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(action, params);
- }
-
- @Override
- public String toString() {
- return "RunCommandParam{" +
- "action=" + action +
- ", params='" + params + '\'' +
- '}';
- }
-}
From 7d89991b7d85d07f2857c78f671b7575fb15e959 Mon Sep 17 00:00:00 2001
From: Jens Andersen
Date: Tue, 4 Jun 2024 12:43:14 +0200
Subject: [PATCH 3/3] Reenabled sec dispatcher code.
Signed-off-by: Jens Andersen
---
.../maven/docker/util/AuthConfigFactory.java | 25 +++++++++----------
.../docker/util/AuthConfigFactoryTest.java | 2 +-
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/src/main/java/io/fabric8/maven/docker/util/AuthConfigFactory.java b/src/main/java/io/fabric8/maven/docker/util/AuthConfigFactory.java
index b401145d3..255f747d4 100644
--- a/src/main/java/io/fabric8/maven/docker/util/AuthConfigFactory.java
+++ b/src/main/java/io/fabric8/maven/docker/util/AuthConfigFactory.java
@@ -663,19 +663,18 @@ private Server checkForServer(Server server, String id, String registry, String
}
private String decrypt(String password) throws MojoExecutionException {
-// try {
-// // Done by reflection since I have classloader issues otherwise
-// Object secDispatcher = container.lookup(SecDispatcher.ROLE, "maven");
-// Method method = secDispatcher.getClass().getMethod("decrypt",String.class);
-// synchronized(secDispatcher) {
-// return (String) method.invoke(secDispatcher, password);
-// }
-// } catch (ComponentLookupException e) {
-// throw new MojoExecutionException("Error looking security dispatcher",e);
-// } catch (ReflectiveOperationException e) {
-// throw new MojoExecutionException("Cannot decrypt password: " + e.getCause(),e);
-// }
- return password;
+ try {
+ // Done by reflection since I have classloader issues otherwise
+ Object secDispatcher = container.lookup(SecDispatcher.ROLE, "maven");
+ Method method = secDispatcher.getClass().getMethod("decrypt",String.class);
+ synchronized(secDispatcher) {
+ return (String) method.invoke(secDispatcher, password);
+ }
+ } catch (ComponentLookupException e) {
+ throw new MojoExecutionException("Error looking security dispatcher",e);
+ } catch (ReflectiveOperationException e) {
+ throw new MojoExecutionException("Cannot decrypt password: " + e.getCause(),e);
+ }
}
private AuthConfig createAuthConfigFromServer(Server server) throws MojoExecutionException {
diff --git a/src/test/java/io/fabric8/maven/docker/util/AuthConfigFactoryTest.java b/src/test/java/io/fabric8/maven/docker/util/AuthConfigFactoryTest.java
index aee14a00c..695181067 100644
--- a/src/test/java/io/fabric8/maven/docker/util/AuthConfigFactoryTest.java
+++ b/src/test/java/io/fabric8/maven/docker/util/AuthConfigFactoryTest.java
@@ -101,7 +101,7 @@ public String decrypt(String password) {
@BeforeEach
void containerSetup() throws ComponentLookupException, SecDispatcherException {
-// Mockito.lenient().when(container.lookup(SecDispatcher.ROLE, "maven")).thenReturn(secDispatcher);
+ Mockito.lenient().when(container.lookup(SecDispatcher.ROLE, "maven")).thenReturn(secDispatcher);
Mockito.lenient().when(secDispatcher.decrypt(Mockito.anyString())).thenAnswer(invocation -> invocation.getArguments()[0]);
factory = new AuthConfigFactory(container);