无法将 JFrog Artifactory 中的 docker 图像从一个存储库复制到目标存储库

Unable to copy docker image in JFrog Artifactory from one repo to a target repo

我们有一个 Artifactory 服务器来托管我们的 Docker 图像。我正在尝试使用 JFrog API 有效地重新标记我的一张 Docker 图像。我知道我可以用一个简单的 docker tagdocker push 来做到这一点,但我想看看如何用 Artifactory API 更直接地做到这一点。不幸的是,我 运行 遇到了麻烦。这是我要拨打的 API 电话:

curl -X POST --user 'my@user.com:MyAPIKey' -H "Content-Type: application/json" --data \
  '{"targetRepo": "docker-local", "dockerRepository": "docker-local", "tag": "my/docker/image/original", "targetTag": "my/docker/image/new", "copy": true}' \
  https://www.myartifactoryserver.com/api/docker/docker-local/v2/promote

但是这个调用returns出现如下错误:

{
  "errors" : [ {
    "status" : 400,
    "message" : "'targetTag' tag value is invalid."
  } ]
}

我不确定我在这里做错了什么,特别是因为我 能够使用UI 执行相同的复制。如何使用 API?

问题出在您用于 dockerRepository、tag 和 targetTag 参数的参数值上。
以下是如何将图像 hello-world:latest(存储在 docker-本地存储库中)重新标记为 hello-world:1.0 的示例:

POST api/docker/docker-local/v2/promote

{
  "repository" : "docker-local", // Source Artifactory repository
  "dockerRepository" : "hello-world", // Source Docker repository
  "targetRepo" : "docker-local", // Target Artifactory repository
  "tag" : "latest", // Source tag name
  "targetTag" : "1.0" // Target tag name
}

下面是发送上述请求的 curl 命令示例:

curl -uuser:password -XPOST -H"content-type: application/json"  -d "{\"repository\" : \"docker-local\", \"dockerRepository\" : \"hello-world\", \"targetRepo\" : \"docker-local\", \"tag\" : \"latest\", \"targetTag\" : \"1.0\"}" https://myserver.jfrog.io/artifactory/api/docker/docker-local/v2/promote

请注意 Artifactory 和 Docker 都使用术语“存储库”,但它们的使用方式不同。
Docker 存储库是标记图像的托管集合,它们共同为容器
创建文件系统 Docker 注册表是存储 Docker 个存储库
的主机 Artifactory 存储库是 Docker 个存储库的托管集合,实际上是一个 Docker 注册表,您可以使用 Docker 客户端透明地访问它。

Dror Bereznitsky 的答案很准确,如果你想做简单的 re-tagging 比如

demo-app:1.0.1 demo-app:latest

但是,如果您的标签是 path-like,您可以使用 Artifactory 术语将图像提升到同一“[=] 中的不同“存储库路径” 35=]Repository”并在两个地方保持相同的“Tag”(版本):

com.example/stage/demo-app:1.0.1 com.example/release/demo-app:1.0.1

像这样将一张图片从 stage 提升到 release

执行 POST 请求,正文如下:

POST /api/docker/devops-docker-local/v2/promote

{
    "repository"             : "devops-docker-local",          // Source Repository
    "dockerRepository"       : "com.example/stage/demo-app",   // Source Path
    "tag"                    : "1.0.1",                        // Source Tag

    "targetRepo"             : "devops-docker-local",          // Target Repository
    "targetDockerRepository" : "com.example/release/demo-app", // Target Path
    "targetTag"              : "1.0.1",                        // Target Tag

    "copy": true
}

API 已使用 Artifactory EnterpriseX 许可证 7.33.8 rev 73308900

进行了测试和截图