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);