在Java程序中的Google Container Registry中列出图像

问题描述

我们想列出名称以某些字符串开头的图像和标签。到目前为止,我们探索了一些java库(docker-java和spotify的库)并进行了大量研究,但仍然找不到出路...

docker-java:'com.github.docker-java',名称:'docker-java',版本:'3.2.5'

以下代码列出了来自公共docker hub的图像,而不是真正指定的GCR。从我们指定的GCR中列出图片的正确方法是什么?

DefaultDockerClientConfig config = DefaultDockerClientConfig
                                      .createDefaultConfigBuilder()
                                      .withRegistryUrl("http://eu.gcr.io/data-infrastructure-test-env")
                                      .withDockerConfig("/home/me/.docker/config.json")
                                      .build();

DockerClient dockerClient = DockerClientBuilder.getInstance(config).build();
List<SearchItem> items = dockerClient.searchImagesCmd("daas").exec();
List<String> images = new ArrayList<>();
for (SearchItem searchItem : items){
  images.add(searchItem.getName());
}

更新-有所进展

受此帖子启发:How to list images and tags from the gcr.io Docker Registry using the HTTP API?

我用自己的Google帐户尝试了以下步骤,该帐户具有项目所有者(无防火墙)权限:

  1. gcloud身份登录
  2. gcloud auth打印访问令牌
  3. 定义一个函数以获取基本身份验证的字符串:

private String basicAuth(String username,String password) { return "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes()); }

4,尝试以下代码:

HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://gcr.io/v2/token?service=eu.gcr.io&scope=registry:my_gcp_project:*"))
    .headers("Accept","application/json","Authorization",basicAuth("_token","the_token_got_from_step_2"))
    .GET()
    .build(); UncheckedObjectMapper objectMapper = new UncheckedObjectMapper(); Map<String,String> response = HttpClient.newHttpClient()
    .sendAsync(request,HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body).thenApply(objectMapper::readValue)
    .get();

String token = response.get("token");

request = HttpRequest.newBuilder().uri(URI.create("https://eu.gcr.io/v2/my_gcp_project/my_image/tags/list"))
                                  .header("Authorization","Bearer " + token)
                                   .GET().build(); String response2 = HttpClient.newHttpClient()
    .sendAsync(request,HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .get();

但是,我得到的答复是: {“错误”:[{“代码”:“未经授权”,“消息”:“请求的存储库与不记名令牌资源不匹配:data-infrastructure-test-env / daas-master”}]}

您能帮忙检查一下哪里出了问题吗?

解决方法

Docker引擎API文档明确指出ImageSearch命令从Docker Hub注册表返回图像:https://docs.docker.com/engine/api/v1.40/#operation/ImageSearch

要搜索GCR注册表,您应该使用Docker registry API

,

终于成功了!

我只需要将第二个请求uri更改为:“ https://eu.gcr.io/v2/my_gcp_project/tags/list”,而不是“ https://eu.gcr.io/v2/my_gcp_project” / my_image / tags / list“

我得到了一些有意义的答复

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...