From 59dca7fef909e3f96a7e2a4518c7b65323e478a9 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Tue, 3 May 2022 10:50:34 -0400 Subject: [PATCH 1/4] Read `indexServerAddress` from Docker's `/info` --- .../org/testcontainers/DockerClientFactory.java | 7 ++++++- .../DockerClientProviderStrategy.java | 8 +++++--- .../utility/RegistryAuthLocator.java | 16 ++++++++++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java index 6cf8f716704..4aa602e305d 100644 --- a/core/src/main/java/org/testcontainers/DockerClientFactory.java +++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java @@ -30,6 +30,7 @@ import org.testcontainers.utility.ComparableVersion; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; +import org.testcontainers.utility.RegistryAuthLocator; import org.testcontainers.utility.ResourceReaper; import org.testcontainers.utility.RyukResourceReaper; import org.testcontainers.utility.TestcontainersConfiguration; @@ -199,7 +200,7 @@ public void close() { }; log.info("Docker host IP address is {}", strategy.getDockerHostIpAddress()); - Info dockerInfo = client.infoCmd().exec(); + Info dockerInfo = strategy.getInfo(); Version version = client.versionCmd().exec(); activeApiVersion = version.getApiVersion(); activeExecutionDriver = dockerInfo.getExecutionDriver(); @@ -209,6 +210,10 @@ public void close() { " Operating System: " + dockerInfo.getOperatingSystem() + "\n" + " Total Memory: " + dockerInfo.getMemTotal() / (1024 * 1024) + " MB"); + if (dockerInfo.getIndexServerAddress() != null) { + RegistryAuthLocator.instance().setIndexServerAddress(dockerInfo.getIndexServerAddress()); + } + final ResourceReaper resourceReaper; try { resourceReaper = ResourceReaper.instance(); diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java index 2ae066d897d..e5f35789deb 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java +++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java @@ -48,6 +48,9 @@ public abstract class DockerClientProviderStrategy { private String dockerHostIpAddress; + @Getter + private Info info; + private final RateLimiter PING_RATE_LIMITER = RateLimiterBuilder.newBuilder() .withRate(10, TimeUnit.SECONDS) .withConstantThroughput() @@ -163,9 +166,8 @@ private static boolean tryOutStrategy(List configurationFailures, Docker log.debug("Trying out strategy: {}", strategy.getClass().getSimpleName()); DockerClient dockerClient = strategy.getDockerClient(); - Info info; try { - info = Unreliables.retryUntilSuccess(TestcontainersConfiguration.getInstance().getClientPingTimeout(), TimeUnit.SECONDS, () -> { + strategy.info = Unreliables.retryUntilSuccess(TestcontainersConfiguration.getInstance().getClientPingTimeout(), TimeUnit.SECONDS, () -> { return strategy.PING_RATE_LIMITER.getWhenReady(() -> { log.debug("Pinging docker daemon..."); return dockerClient.infoCmd().exec(); @@ -183,7 +185,7 @@ private static boolean tryOutStrategy(List configurationFailures, Docker ); log.debug("Checking Docker OS type for {}", strategy.getDescription()); - String osType = info.getOsType(); + String osType = strategy.getInfo().getOsType(); if (StringUtils.isBlank(osType)) { log.warn("Could not determine Docker OS type"); } else if (!osType.equals("linux")) { diff --git a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java index d88bdccd76a..2854712a891 100644 --- a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java +++ b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; import org.slf4j.Logger; +import org.testcontainers.UnstableAPI; import org.zeroturnaround.exec.InvalidResultException; import org.zeroturnaround.exec.ProcessExecutor; @@ -32,7 +33,6 @@ public class RegistryAuthLocator { private static final Logger log = getLogger(RegistryAuthLocator.class); - private static final String DEFAULT_REGISTRY_NAME = "index.docker.io"; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static RegistryAuthLocator instance; @@ -43,6 +43,8 @@ public class RegistryAuthLocator { private final Map> cache = new ConcurrentHashMap<>(); + private String indexServerAddress = "https://index.docker.io/v1/"; + /** * key - credential helper's name * value - helper's response for "credentials not found" use case @@ -79,6 +81,16 @@ public synchronized static RegistryAuthLocator instance() { return instance; } + /** + * + * Internal method, not expected to be called by a regular user + * + */ + @UnstableAPI + public void setIndexServerAddress(String indexServerAddress) { + this.indexServerAddress = indexServerAddress; + } + @VisibleForTesting static void setInstance(RegistryAuthLocator overrideInstance) { instance = overrideInstance; @@ -282,7 +294,7 @@ private String getCredentialProgramName(String credHelper) { } private String effectiveRegistryName(DockerImageName dockerImageName) { - return StringUtils.defaultIfEmpty(dockerImageName.getRegistry(), DEFAULT_REGISTRY_NAME); + return StringUtils.defaultIfEmpty(dockerImageName.getRegistry(), indexServerAddress); } private String getGenericCredentialsNotFoundMsg(String credentialHelperName) { From 9d8d69d8103f42c81e1151df224309f09ccf3bd3 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Tue, 3 May 2022 11:05:42 -0400 Subject: [PATCH 2/4] remove `setIndexServerAddress` --- .../testcontainers/DockerClientFactory.java | 10 ++++---- .../utility/RegistryAuthLocator.java | 24 ++++++++----------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java index 4aa602e305d..cc85645b2b4 100644 --- a/core/src/main/java/org/testcontainers/DockerClientFactory.java +++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java @@ -30,7 +30,6 @@ import org.testcontainers.utility.ComparableVersion; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; -import org.testcontainers.utility.RegistryAuthLocator; import org.testcontainers.utility.ResourceReaper; import org.testcontainers.utility.RyukResourceReaper; import org.testcontainers.utility.TestcontainersConfiguration; @@ -210,10 +209,6 @@ public void close() { " Operating System: " + dockerInfo.getOperatingSystem() + "\n" + " Total Memory: " + dockerInfo.getMemTotal() / (1024 * 1024) + " MB"); - if (dockerInfo.getIndexServerAddress() != null) { - RegistryAuthLocator.instance().setIndexServerAddress(dockerInfo.getIndexServerAddress()); - } - final ResourceReaper resourceReaper; try { resourceReaper = ResourceReaper.instance(); @@ -439,4 +434,9 @@ public String getActiveExecutionDriver() { public boolean isUsing(Class providerStrategyClass) { return strategy != null && providerStrategyClass.isAssignableFrom(this.strategy.getClass()); } + + @UnstableAPI + public Info getInfo() { + return getOrInitializeStrategy().getInfo(); + } } diff --git a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java index 2854712a891..ce333b7cdee 100644 --- a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java +++ b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java @@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; import org.slf4j.Logger; -import org.testcontainers.UnstableAPI; +import org.testcontainers.DockerClientFactory; import org.zeroturnaround.exec.InvalidResultException; import org.zeroturnaround.exec.ProcessExecutor; @@ -33,6 +33,7 @@ public class RegistryAuthLocator { private static final Logger log = getLogger(RegistryAuthLocator.class); + private static final String DEFAULT_REGISTRY_NAME = "index.docker.io"; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static RegistryAuthLocator instance; @@ -43,8 +44,6 @@ public class RegistryAuthLocator { private final Map> cache = new ConcurrentHashMap<>(); - private String indexServerAddress = "https://index.docker.io/v1/"; - /** * key - credential helper's name * value - helper's response for "credentials not found" use case @@ -81,16 +80,6 @@ public synchronized static RegistryAuthLocator instance() { return instance; } - /** - * - * Internal method, not expected to be called by a regular user - * - */ - @UnstableAPI - public void setIndexServerAddress(String indexServerAddress) { - this.indexServerAddress = indexServerAddress; - } - @VisibleForTesting static void setInstance(RegistryAuthLocator overrideInstance) { instance = overrideInstance; @@ -294,7 +283,14 @@ private String getCredentialProgramName(String credHelper) { } private String effectiveRegistryName(DockerImageName dockerImageName) { - return StringUtils.defaultIfEmpty(dockerImageName.getRegistry(), indexServerAddress); + final String registry = dockerImageName.getRegistry(); + if (!StringUtils.isEmpty(registry)) { + return registry; + } + return StringUtils.defaultString( + DockerClientFactory.instance().getInfo().getIndexServerAddress(), + DEFAULT_REGISTRY_NAME + ); } private String getGenericCredentialsNotFoundMsg(String credentialHelperName) { From 4d297025dd8ac6e177010e55bbae1fdc132f18f2 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Tue, 10 May 2022 18:40:40 +0100 Subject: [PATCH 3/4] Update fallback default registry name to `https://index.docker.io/v1/` --- .../java/org/testcontainers/utility/RegistryAuthLocator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java index ce333b7cdee..e487bda686b 100644 --- a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java +++ b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java @@ -33,7 +33,7 @@ public class RegistryAuthLocator { private static final Logger log = getLogger(RegistryAuthLocator.class); - private static final String DEFAULT_REGISTRY_NAME = "index.docker.io"; + private static final String DEFAULT_REGISTRY_NAME = "https://index.docker.io/v1/"; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static RegistryAuthLocator instance; From baf6b1b98f600ff4fe695fd08eddcea1a206a87b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 11 May 2022 12:52:55 -0500 Subject: [PATCH 4/4] Fix build --- .../dockerclient/DockerClientProviderStrategy.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java index d2c578cc86c..834e670438a 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java +++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java @@ -252,6 +252,7 @@ private static boolean tryOutStrategy(List configurationFailures, Docker return false; } + strategy.info = strategy.getDockerClient().infoCmd().exec(); log.info("Found Docker environment with {}", strategy.getDescription()); log.debug( "Transport type: '{}', Docker host: '{}'",