无法将 JFrog Artifactory 中的 docker 图像从一个存储库复制到目标存储库
Unable to copy docker image in JFrog Artifactory from one repo to a target repo
我们有一个 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
但是这个调用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
进行了测试和截图
我们有一个 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
但是这个调用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
进行了测试和截图