Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Commit 96dc4bf

Browse files
tzolovjvalkeal
authored andcommitted
Replace k8s secret's default server values
When approriating the .dockerconfigjson secrets for Container Metadata retrieval replace the default `https://index.docker.io/v1/` or `domain.io` docker-server values to `registry-1.docker.io`. Backport #4428 Resolves #4429
1 parent c15cf36 commit 96dc4bf

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

spring-cloud-dataflow-container-registry/src/main/java/org/springframework/cloud/dataflow/container/registry/ContainerRegistryProperties.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,19 @@ public class ContainerRegistryProperties {
6464
*/
6565
private HttpProxy httpProxy = new HttpProxy();
6666

67+
/**
68+
* When the `kubectl create secret docker-registry` command is used without explicit docker-server property set
69+
* the later defaults to `https://index.docker.io/v1/` (or to `domain.io`). Those secrets can be used as
70+
* K8s `imagePullSecret` to pull images from Docker Hub but can not be used for SCDF Metadata Container Registry access.
71+
* Later expects a docker-server=registry-1.docker.io instead.
72+
* To be able to reuse docker registry secretes for the purpose of imagePullSecrets and SCDF Container Metadata retrieval.
73+
* by default the `https://index.docker.io/v1/` and `domain.io` docker-server values found in any mounted dockerconfigjson secret
74+
* are replaced by `registry-1.docker.io`.
75+
*
76+
* You can override this behaviour by setting replaceDefaultDockerRegistryServer to false.
77+
*/
78+
private boolean replaceDefaultDockerRegistryServer = true;
79+
6780
public static class HttpProxy {
6881
private String host = "";
6982
private int port = 0;
@@ -125,6 +138,14 @@ public void setOfficialRepositoryNamespace(String officialRepositoryNamespace) {
125138
this.officialRepositoryNamespace = officialRepositoryNamespace;
126139
}
127140

141+
public boolean isReplaceDefaultDockerRegistryServer() {
142+
return replaceDefaultDockerRegistryServer;
143+
}
144+
145+
public void setReplaceDefaultDockerRegistryServer(boolean replaceDefaultDockerRegistryServer) {
146+
this.replaceDefaultDockerRegistryServer = replaceDefaultDockerRegistryServer;
147+
}
148+
128149
@Override
129150
public String toString() {
130151
return "ContainerRegistryProperties{" +

spring-cloud-dataflow-container-registry/src/main/java/org/springframework/cloud/dataflow/container/registry/authorization/DockerConfigJsonSecretToRegistryConfigurationConverter.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,21 @@ public class DockerConfigJsonSecretToRegistryConfigurationConverter implements C
4949
private static final Logger logger = LoggerFactory.getLogger(DockerConfigJsonSecretToRegistryConfigurationConverter.class);
5050
public static final String BEARER_REALM_ATTRIBUTE = "Bearer realm";
5151
public static final String SERVICE_ATTRIBUTE = "service";
52+
public static final String HTTPS_INDEX_DOCKER_IO_V_1 = "https://index.docker.io/v1/";
53+
public static final String DOCKER_IO = "docker.io";
54+
public static final String REGISTRY_1_DOCKER_IO = "registry-1.docker.io";
5255

5356
// private final RestTemplate restTemplate;
5457
private final ContainerImageRestTemplateFactory containerImageRestTemplate;
5558

5659
private final Map<String, Boolean> httpProxyPerHost;
5760

61+
private final boolean replaceDefaultDockerRegistryServer;
62+
5863
public DockerConfigJsonSecretToRegistryConfigurationConverter(ContainerRegistryProperties properties,
5964
ContainerImageRestTemplateFactory containerImageRestTemplate) {
6065

66+
this.replaceDefaultDockerRegistryServer = properties.isReplaceDefaultDockerRegistryServer();
6167
// Retrieve registry configurations, explicitly declared via properties.
6268
this.httpProxyPerHost = properties.getRegistryConfigurations().entrySet().stream()
6369
.collect(Collectors.toMap(e -> e.getValue().getRegistryHost(), e -> e.getValue().isUseHttpProxy()));
@@ -86,7 +92,7 @@ public Map<String, ContainerRegistryConfiguration> convert(String dockerconfigjs
8692
Map<String, ContainerRegistryConfiguration> registryConfigurationMap = new HashMap<>();
8793
for (Object registryUrl : authsMap.keySet()) {
8894
ContainerRegistryConfiguration rc = new ContainerRegistryConfiguration();
89-
rc.setRegistryHost(registryUrl.toString());
95+
rc.setRegistryHost(replaceDefaultDockerRegistryServerUrl(registryUrl.toString()));
9096
Map registryMap = (Map) authsMap.get(registryUrl.toString());
9197
rc.setUser((String) registryMap.get("username"));
9298
rc.setSecret((String) registryMap.get("password"));
@@ -120,6 +126,26 @@ public Map<String, ContainerRegistryConfiguration> convert(String dockerconfigjs
120126
return Collections.emptyMap();
121127
}
122128

129+
/**
130+
* When the `kubectl create secret docker-registry` command is used without explicit docker-server property set
131+
* the later defaults to `https://index.docker.io/v1/` (or to `domain.io`). Those secrets can be used as
132+
* K8s `imagePullSecret` to pull images from Docker Hub but can not be used for SCDF Metadata Container Registry access.
133+
* Later expects a docker-server=registry-1.docker.io instead.
134+
* To be able to reuse docker registry secretes for the purpose of imagePullSecrets and SCDF Container Metadata retrieval.
135+
* by default the `https://index.docker.io/v1/` and `domain.io` docker-server values found in any mounted dockerconfigjson secret
136+
* are replaced by `registry-1.docker.io`.
137+
*
138+
* You can override this behaviour by setting replaceDefaultDockerRegistryServer to false.
139+
*
140+
* @param dockerConfigJsonRegistryHost Docker-Server property value as extracted from the dockerconfigjson.
141+
* @return If input url is "https://index.docker.io/v1/" or "docker.io" then return "registry-1.docker.io". Otherwise return the input url.
142+
*/
143+
private String replaceDefaultDockerRegistryServerUrl(String dockerConfigJsonRegistryHost) {
144+
return (this.replaceDefaultDockerRegistryServer && (DOCKER_IO.equals(dockerConfigJsonRegistryHost)
145+
|| HTTPS_INDEX_DOCKER_IO_V_1.equals(dockerConfigJsonRegistryHost))) ?
146+
REGISTRY_1_DOCKER_IO : dockerConfigJsonRegistryHost;
147+
}
148+
123149
/**
124150
* Best effort to construct a valid Docker OAuth2 token authorization uri from the HTTP 401 Error response.
125151
*

0 commit comments

Comments
 (0)