如何使用 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 以某种方式删除该图像。 @Aadmaa config.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 构建的容器映像?的主要内容,如果未能解决你的问题,请参考以下文章