【问题标题】:Unable to copy docker image in JFrog Artifactory from one repo to a target repo无法将 JFrog Artifactory 中的 docker 映像从一个仓库复制到目标仓库
【发布时间】:2021-02-10 20:18:12
【问题描述】:

我们有一个 Artifactory 服务器来托管我们的 Docker 镜像。我正在尝试使用 JFrog API 有效地重新标记我的一个 Docker 映像。我知道我可以用一个简单的docker tag 和docker 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

但此调用返回以下错误:

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

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

【问题讨论】:

    标签: docker artifactory


    【解决方案1】:

    问题在于您用于 dockerRepository、tag 和 targetTag 参数的参数值。
    这是一个如何将图像 hello-world:latest(存储在 docker-local 存储库中)重新标记为 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 客户端透明地访问它。

    【讨论】:

      【解决方案2】:

      Dror Bereznitsky 的答案是正确的,如果你想做简单的重新标记,比如

          demo-app:1.0.1 ? demo-app:latest

      但是,如果您的标签是类似路径的,您可以使用 Artifactory 术语,将图像提升到同一“Repository”内的不同“Repository Path”并在两个地方保持相同的“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
      }
      

      使用 Artifactory EnterpriseX 许可证 7.33.8 rev 73308900 测试 API 并截取屏幕截图

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多