Skip to content

Commit

Permalink
Differentiate the username/password for pulling base image with Jib
Browse files Browse the repository at this point in the history
  • Loading branch information
geoand committed Apr 9, 2020
1 parent 8708150 commit 3047832
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.List;
import java.util.Map;
import java.util.Optional;

import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigPhase;
Expand Down Expand Up @@ -44,5 +45,17 @@ public class JibConfig {
* Custom labels to add to the generated image
*/
@ConfigItem
Map<String, String> labels;
public Map<String, String> labels;

/**
* The username to use to authenticate with the registry used to pull the base JVM image
*/
@ConfigItem
public Optional<String> baseRegistryUsername;

/**
* The password to use to authenticate with the registry used to pull the base JVM image
*/
@ConfigItem
public Optional<String> baseRegistryPassword;
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,9 @@ public void buildFromJar(ContainerImageConfig containerImageConfig, JibConfig ji
return;
}

JibContainerBuilder jibContainerBuilder = createContainerBuilderFromJar(containerImageConfig, jibConfig,
JibContainerBuilder jibContainerBuilder = createContainerBuilderFromJar(jibConfig,
sourceJar, outputTarget, mainClass, containerImageLabels);
JibContainer container = containerize(applicationInfo, containerImageConfig, jibConfig, jibContainerBuilder,
JibContainer container = containerize(applicationInfo, containerImageConfig, jibContainerBuilder,
pushRequest.isPresent());

ImageReference targetImage = container.getTargetImage();
Expand Down Expand Up @@ -107,7 +107,7 @@ public void buildFromNative(ContainerImageConfig containerImageConfig, JibConfig

JibContainerBuilder jibContainerBuilder = createContainerBuilderFromNative(containerImageConfig, jibConfig,
nativeImage, containerImageLabels);
JibContainer container = containerize(applicationInfo, containerImageConfig, jibConfig, jibContainerBuilder,
JibContainer container = containerize(applicationInfo, containerImageConfig, jibContainerBuilder,
pushRequest.isPresent());

ImageReference targetImage = container.getTargetImage();
Expand All @@ -117,9 +117,8 @@ public void buildFromNative(ContainerImageConfig containerImageConfig, JibConfig
}

private JibContainer containerize(ApplicationInfoBuildItem applicationInfo, ContainerImageConfig containerImageConfig,
JibConfig jibConfig,
JibContainerBuilder jibContainerBuilder, boolean pushRequested) {
Containerizer containerizer = createContainerizer(containerImageConfig, jibConfig, applicationInfo, pushRequested);
Containerizer containerizer = createContainerizer(containerImageConfig, applicationInfo, pushRequested);
try {
log.info("Starting container image build");
JibContainer container = jibContainerBuilder.containerize(containerizer);
Expand All @@ -133,7 +132,7 @@ private JibContainer containerize(ApplicationInfoBuildItem applicationInfo, Cont
}
}

private Containerizer createContainerizer(ContainerImageConfig containerImageConfig, JibConfig jibConfig,
private Containerizer createContainerizer(ContainerImageConfig containerImageConfig,
ApplicationInfoBuildItem applicationInfo, boolean pushRequested) {
Containerizer containerizer;
ImageReference imageReference = getImageReference(containerImageConfig, applicationInfo);
Expand All @@ -142,7 +141,8 @@ private Containerizer createContainerizer(ContainerImageConfig containerImageCon
if (!containerImageConfig.registry.isPresent()) {
log.info("No container image registry was set, so 'docker.io' will be used");
}
RegistryImage registryImage = toRegistryImage(imageReference, containerImageConfig);
RegistryImage registryImage = toRegistryImage(imageReference, containerImageConfig.username,
containerImageConfig.password);
containerizer = Containerizer.to(registryImage);
} else {
containerizer = Containerizer.to(DockerDaemonImage.named(imageReference));
Expand All @@ -157,14 +157,14 @@ private Containerizer createContainerizer(ContainerImageConfig containerImageCon
return containerizer;
}

private RegistryImage toRegistryImage(ImageReference imageReference, ContainerImageConfig containerImageConfig) {
private RegistryImage toRegistryImage(ImageReference imageReference, Optional<String> username, Optional<String> password) {
CredentialRetrieverFactory credentialRetrieverFactory = CredentialRetrieverFactory.forImage(imageReference,
log::info);
RegistryImage registryImage = RegistryImage.named(imageReference);
registryImage.addCredentialRetriever(credentialRetrieverFactory.wellKnownCredentialHelpers());
registryImage.addCredentialRetriever(credentialRetrieverFactory.dockerConfig());
if (containerImageConfig.username.isPresent() && containerImageConfig.password.isPresent()) {
registryImage.addCredential(containerImageConfig.username.get(), containerImageConfig.password.get());
if (username.isPresent() && password.isPresent()) {
registryImage.addCredential(username.get(), password.get());
}
return registryImage;
}
Expand All @@ -190,7 +190,7 @@ private ImageReference getImageReference(ContainerImageConfig containerImageConf
containerImageConfig.tag.orElse(applicationInfo.getVersion()));
}

private JibContainerBuilder createContainerBuilderFromJar(ContainerImageConfig containerImageConfig, JibConfig jibConfig,
private JibContainerBuilder createContainerBuilderFromJar(JibConfig jibConfig,
JarBuildItem sourceJarBuildItem,
OutputTargetBuildItem outputTargetBuildItem, MainClassBuildItem mainClassBuildItem,
List<ContainerImageLabelBuildItem> containerImageLabels) {
Expand All @@ -199,7 +199,8 @@ private JibContainerBuilder createContainerBuilderFromJar(ContainerImageConfig c
Path classesDir = outputTargetBuildItem.getOutputDirectory().resolve("jib");
ZipUtils.unzip(sourceJarBuildItem.getPath(), classesDir);
JavaContainerBuilder javaContainerBuilder = JavaContainerBuilder
.from(toRegistryImage(ImageReference.parse(jibConfig.baseJvmImage), containerImageConfig))
.from(toRegistryImage(ImageReference.parse(jibConfig.baseJvmImage), jibConfig.baseRegistryUsername,
jibConfig.baseRegistryPassword))
.addResources(classesDir, IS_CLASS_PREDICATE.negate())
.addClasses(classesDir, IS_CLASS_PREDICATE)
.addJvmFlags(jibConfig.jvmArguments)
Expand Down Expand Up @@ -231,7 +232,9 @@ private JibContainerBuilder createContainerBuilderFromNative(ContainerImageConfi
entrypoint.addAll(jibConfig.nativeArguments);
try {
AbsoluteUnixPath workDirInContainer = AbsoluteUnixPath.get("/work");
return Jib.from(toRegistryImage(ImageReference.parse(jibConfig.baseNativeImage), containerImageConfig))
return Jib
.from(toRegistryImage(ImageReference.parse(jibConfig.baseNativeImage), containerImageConfig.username,
containerImageConfig.password))
.addLayer(LayerConfiguration.builder()
.addEntry(nativeImageBuildItem.getPath(), workDirInContainer.resolve(BINARY_NAME_IN_CONTAINER),
FilePermissions.fromOctalString("775"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,13 @@ public class ContainerImageConfig {
public Optional<String> registry;

/**
* The username to use to authenticate with the registry
* The username to use to authenticate with the registry where the built image will be pushed
*/
@ConfigItem
public Optional<String> username;

/**
* The password to use to authenticate with the registry
* The password to use to authenticate with the registry where the built image will be pushed
*/
@ConfigItem
public Optional<String> password;
Expand Down

0 comments on commit 3047832

Please sign in to comment.