0

我们想列出名称以特定字符串开头的图像和标签。到目前为止,我们探索了一些 java lib(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());
}

更新 - 一些进展

受这篇文章的启发:如何使用 HTTP API 从 gcr.io Docker Registry 中列出图像和标签?

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

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

但是,我得到的响应是: {"errors":[{"code":"UNAUTHORIZED","message":"Requested repository does not match bearer token resource: data-infrastructure-test-env/daas-master"} ]}

你能帮忙检查一下出了什么问题吗?

4

2 回答 2

1

终于搞定了!

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

我得到了一些有意义的回应

于 2020-09-16T02:24:15.813 回答
1

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

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

于 2020-09-15T15:49:13.220 回答