如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?
Posted
技术标签:
【中文标题】如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?【英文标题】:How do I programmatically find and delete a container image built through Google Cloud Build with the googleapis Artifacts API? 【发布时间】:2022-01-23 07:09:45 【问题描述】:我的目标是找到并删除我之前通过 Google Cloud Build 构建的 Docker 容器映像(通过 Node googleapis 库,使用 Artifacts API)。我在构建容器时将信息传回给我,我想通过 Node googleapis 库将其删除。
Cloud Build 返回的镜像路径如下:“us-central1-docker.pkg.dev/project-1234/dev/foo:bar”
我尝试删除工件失败,如下所示:
const artifacts = artifactregistry( version: 'v1beta2', auth: authClient);
await artifacts.projects.locations.repositories.packages.delete(name: config.containerLocation)
这会导致错误:在此服务器上找不到请求的 URL /v1beta2/us-central1-docker.pkg.dev/project-1234/dev/foo:bar。 看起来好像我没有正确指定位置,但不清楚如何解决。
我应该如何删除图像?
【问题讨论】:
网址错误。但是,您没有发布足够的代码,并且您掩盖了太多变量以了解问题。 API 端点以 artifactregistry.googleapis.com/v1beta2 开头 我没有直接到达终点;如图所示,我正在使用 googleapis 节点库。我的代码没有被屏蔽;除了 config.container 有不同的项目、容器和标签名称。除了这些变量之外,CloudBuild 还提供了该格式的图像位置;并且应该可以使用 Artifacts API 以某种方式删除该图像。 @Aadmaaconfig.containerLocation
的值是多少?此外,我建议使用更新的 Artifact Registry 库,正如 Ricco 在他的回答中所展示的那样。 Cloud 客户端库是以编程方式访问 Cloud API 的现代标准。
谢谢唐纳德。该值是 Cloud Build 返回的映像位置值。这里是字符串:“us-central1-docker.pkg.dev/project-1234/dev/foo:bar”
【参考方案1】:
我能够使用 Artifact Registry Cloud 客户端库删除一个包,因为这是现在推荐的访问 API 的方法,因为它更易于使用且有据可查。见Cloud Client Library docs。
下面的代码展示了如何在 Artifact Registry 中删除一个包,前提是您已经知道要删除哪个包。这在namePackage
变量中定义,并传递给callDeletePackage()
,后者将调用deletePackage() 继续删除。
const ArtifactRegistryClient = require('@google-cloud/artifact-registry');
const client = new ArtifactRegistryClient();
async function main()
const projectId = 'project-id';
const location = 'us-central1';
const repositoryName = 'your-repository-name';
const packageName = 'your-package-name';
var namePackage = `projects/$projectId/locations/$location/repositories/$repositoryName/packages/$packageName`;
callDeletePackage(namePackage);
async function callDeletePackage(name)
const deletePack = await client.deletePackage(name: name);
console.log(deletePack);
main();
如果您需要以编程方式获取存储库和软件包,您可以查看此代码。它有listsRepositories()
、listsPackages()
和callDeletePackage()
。
listsRepositories()
列出了可用的仓库,你可以选择哪个仓库有要删除的包。
listsPackages()
列出所选存储库的包
callDeletePackage()
删除包。
下面的代码只获取存储库和包的返回列表中的第一个元素,然后删除。如何删除所需的包由您决定。
const ArtifactRegistryClient = require('@google-cloud/artifact-registry');
const client = new ArtifactRegistryClient();
async function main()
const projectId = 'your-project-id';
const location = 'us-central1';
var parentRepo = `projects/$projectId/locations/$location`;
names = await listsRepositories(parentRepo);
var nameRepo = names[0];
console.log(nameRepo);
var repos = await listsPackages(nameRepo);
console.log(repos[0])
callDeletePackage(repos[0]);
async function listsRepositories(parent)
var nameArr = []
const repositories = await client.listRepositories(parent : parent);
const repo = repositories[0];
for (const data in repo)
nameArr.push(repo[data].name);
return nameArr;
async function listsPackages(parent)
var namePackArr = []
const packages = await client.listPackages(parent : parent);
const pack = packages[0];
for (const data in pack)
namePackArr.push(pack[data].name);
return namePackArr;
async function callDeletePackage(name)
const deletePack = await client.deletePackage(name: name);
console.log(deletePack);
main();
【讨论】:
谢谢@Ricco。对于以后遵循此操作的任何人:(1)确保运行代码的服务帐户具有所需的工件角色(2)如果您需要通过 API 进行身份验证,并且您还按照建议从 googleapis 切换,您可能还必须从“google-auth-library”而不是从“googleapis”获取 GoogleAuth以上是关于如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PAT 从本地 Azure Artifacts 存储库在 docker 容器中安装 powershell 模块?
如何在 Android 中签署 AAR Artifacts?
如何使用 googleapis bigquery api 进行选择
IntelliJ-项目配置,解决no artifacts的warnings
使用 npm 包 googleapis 在对用户进行身份验证后如何获取用户的电子邮件地址?
intellij idea 中project structure 配置 的Artifacts配置 Webapplication:exploded 和 archive区别