> For the complete documentation index, see [llms.txt](https://tccli-agent.gitbook.io/tccli/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tccli-agent.gitbook.io/tccli/v2/tcr-rong-qi-jing-xiang-fu-wu/index-3/advanced.md).

# 个人版高级管理

> 个人版仓库查询过滤、镜像复制、生命周期策略、应用触发器。核心 CRUD 见 [个人版全功能](/tccli/v2/tcr-rong-qi-jing-xiang-fu-wu/index-3/manage.md)。

> 官方文档: [容器镜像服务个人版](https://cloud.tencent.com/document/product/1141/57780) · [个人版迁移至企业版完全指南](https://cloud.tencent.com/document/product/1141/52292)

> 个人版 API 形态与企业版不同——所有 Action 带 `Personal` 后缀。`RepoName` 格式是 `<NAMESPACE_NAME>/<REPO_NAME>`（含斜杠）。 镜像层 push/pull 仍走 docker CLI（非 tccli；TCCLI 不提供 docker daemon 能力）；本页只覆盖个人版高级 API。

## 触发条件

* `tccli tcr DescribeRepositoryFilterPersonal --Namespace "<NAMESPACE_NAME>"` 需按可见性/收藏/所有者过滤，`DescribeNamespacePersonal` 无法精细过滤
* `DuplicateImagePersonal` 需同账号内复制镜像（跨命名空间/仓库），`DescribeImagePersonal` 显示源镜像存在但目标仓库缺该 tag
* `DescribeImageLifecycleGlobalPersonal` 返回 `Data.TotalCount: 0`，旧镜像堆积需全局生命周期策略自动清理
* `docker push` 后需自动触发 TKE 部署，`DescribeApplicationTriggerPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>"` 返回空（无触发器）

## 准备工作

* 已开通 TCR 个人版 + 已创建命名空间
* 已配置 tccli 凭证 (见 [配置凭证](/tccli/v2/zhun-bei-gong-zuo/credentials.md))

## 概述

| 任务    | 接口                                   | 用途           |
| ----- | ------------------------------------ | ------------ |
| 仓库查询  | `DescribeRepositoryFilterPersonal` 等 | 过滤/收藏/所有者查询  |
| 仓库属性  | `ModifyRepositoryAccessPersonal` 等   | 改可见性/描述/批量删  |
| 镜像复制  | `DuplicateImagePersonal`             | 同账号内复制镜像     |
| 生命周期  | `ManageImageLifecycleGlobalPersonal` | 自动清理旧镜像      |
| 应用触发器 | `CreateApplicationTriggerPersonal`   | 推送后触发 TKE 部署 |

## 决策依据

### 仓库可见性（Public vs Private）

* **Public (1)**: 公开仓库，任何人可拉取（docker pull 无需凭证）。开源镜像/共享制品
* **Private (0)**: 私有仓库，需凭证拉取。生产/私有制品（默认推荐）
* **决策依据**: 含敏感信息或生产镜像用 Private；公共基础镜像用 Public

### 生命周期策略（全局 vs 仓库级）

* **全局策略**: `ManageImageLifecycleGlobalPersonal`，对所有仓库生效，无 `RepoName`
* **仓库级策略**: `DescribeImageLifecyclePersonal` 查单仓库，粒度更细
* **Type 选择**: `global_keep_last_days`（按天保留）/ `global_keep_last_nums`（按个数保留）
* **决策依据**: 统一清理用全局；个别仓库特殊保留期用仓库级

### 应用触发器（何时用）

* **触发器**: 推送镜像后自动更新 TKE 工作负载，实现 push 即部署
* **何时用**: CI/CD 无独立部署步骤时，用触发器联动 TKE
* **不用触发器**: 有成熟 CI/CD（Jenkins/GitLab CI）时，由 CI/CD 控制部署，避免重复触发

## 关键字段

| 参数                                                                        | 所属 Action                          |    必填    | 说明                                                    |
| ------------------------------------------------------------------------- | ---------------------------------- | :------: | ----------------------------------------------------- |
| `RepoName`                                                                | 多数                                 |     是    | `<NAMESPACE_NAME>/<REPO_NAME>`（含斜杠）                   |
| `Namespace`                                                               | ValidateNamespaceExistPersonal     |     是    | 待校验的个人版命名空间名                                          |
| `Namespace`                                                               | CreateApplicationTriggerPersonal   |     是    | 触发器关联工作负载的 **K8s** 命名空间                               |
| `Namespace`                                                               | 其他查询                               | 视 Action | 作为筛选条件时按对应 Action 说明传入                                |
| `Public`                                                                  | ModifyRepositoryAccessPersonal     |     是    | 1 公开 / 0 私有                                           |
| `SrcImage`/`DestImage`                                                    | DuplicateImagePersonal             |     是    | `<SRC_NAMESPACE>/<SRC_REPOSITORY>:<IMAGE_TAG>`        |
| `Type`/`Val`                                                              | ManageImageLifecycleGlobalPersonal |     是    | `global_keep_last_days`/`global_keep_last_nums` + 保留值 |
| `TriggerName`                                                             | 触发器类                               |     是    | 触发器名                                                  |
| `InvokeMethod`                                                            | CreateApplicationTriggerPersonal   |     是    | **仅** `all` / `taglist` / `regex`（无 `void`）           |
| `InvokeMethod`                                                            | ModifyApplicationTriggerPersonal   |     否    | 不修改触发方式时可省略；传入时枚举为 `all` / `taglist` / `regex`        |
| `ClusterId`/`WorkloadType`/`WorkloadName`/`ContainerName`/`ClusterRegion` | CreateApplicationTriggerPersonal   |     是    | 关联 TKE 集群/工作负载/容器；`ClusterRegion` 为地域**数字 ID**        |

## 操作步骤

### 步骤 1：仓库查询与校验

```bash
# 校验命名空间是否存在 (建仓前用)
tccli tcr ValidateNamespaceExistPersonal --Namespace "<NAMESPACE_NAME>"
# expected: exit 0, Data.IsExist=true/false
```

```json
{"Data": {"IsExist": false, "IsPreserved": false}, "RequestId": "..."}
```

```bash
# 校验仓库是否存在
tccli tcr ValidateRepositoryExistPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>"
# expected: exit 0, Data.IsExist

# 按条件过滤仓库 (Public/Namespace 过滤)
tccli tcr DescribeRepositoryFilterPersonal --Namespace "<NAMESPACE_NAME>" --Limit 10 --Offset 0
# expected: exit 0, Data.RepoInfo[] + Server (ccr.ccs.tencentyun.com)

# 查询收藏的仓库
tccli tcr DescribeFavorRepositoryPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Limit 10 --Offset 0
# expected: exit 0, Data.RepoInfo[]

# 查询仓库所有者
tccli tcr DescribeRepositoryOwnerPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Limit 10
# expected: exit 0, Data
```

### 步骤 2：修改仓库属性

```bash
# 修改仓库可见性 (Public: 1 公开 / 0 私有)
tccli tcr ModifyRepositoryAccessPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Public 0
# expected: exit 0

# 修改仓库描述
tccli tcr ModifyRepositoryInfoPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Description "<DESCRIPTION>"
# expected: exit 0

# 批量删除仓库
tccli tcr BatchDeleteRepositoryPersonal --RepoNames '["<NAMESPACE_NAME>/<REPO_NAME>"]'
# expected: exit 0
```

### 步骤 3：镜像复制与批量删除

```bash
# 复制镜像 (同账号内, SrcImage/DestImage 格式 ns/repo:tag)
tccli tcr DuplicateImagePersonal --SrcImage "<SRC_NAMESPACE>/<SRC_REPOSITORY>:<IMAGE_TAG>" --DestImage "<DEST_NAMESPACE>/<DEST_REPOSITORY>:<IMAGE_TAG>"
# expected: exit 0

# 按标签过滤镜像
tccli tcr DescribeImageFilterPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Tag "<IMAGE_TAG>"
# expected: exit 0, Data

# 批量删除镜像
tccli tcr BatchDeleteImagePersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Tags '["<IMAGE_TAG_1>","<IMAGE_TAG_2>"]'
# expected: exit 0
```

### 步骤 4：生命周期策略

```bash
# 查询全局生命周期策略 (无入参, 账号级)
tccli tcr DescribeImageLifecycleGlobalPersonal
# expected: exit 0, Data.StrategyInfo[] (Type 如 global_keep_last_days)
```

```json
{"Data": {"TotalCount": 2, "StrategyInfo": [{"Username": "1000000000", "RepoName": "", "Type": "global_keep_last_days"}]}}
```

```bash
# 设置全局生命周期 (Type=global_keep_last_days, Val=保留天数)
tccli tcr ManageImageLifecycleGlobalPersonal --Type global_keep_last_days --Val 30
# expected: exit 0

# 删除全局生命周期 (无入参)
tccli tcr DeleteImageLifecycleGlobalPersonal
# expected: exit 0

# 查询仓库级生命周期
tccli tcr DescribeImageLifecyclePersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>"
# expected: exit 0, Data
```

### 步骤 5：应用触发器（推送后触发 TKE 部署）

```bash
# 创建应用触发器（关联 TKE 集群；推送镜像后自动更新工作负载）
# InvokeMethod 仅 all|taglist|regex（无 void）；ContainerName/ClusterRegion 必填
tccli tcr CreateApplicationTriggerPersonal \
  --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" \
  --TriggerName "<TRIGGER_NAME>" \
  --InvokeMethod all \
  --ClusterId "<CLUSTER_ID>" --Namespace "<K8S_NAMESPACE>" \
  --WorkloadType Deployment --WorkloadName "<WORKLOAD_NAME>" \
  --ContainerName "<CONTAINER_NAME>" \
  --ClusterRegion <CLUSTER_REGION_ID>
# expected: exit 0；缺 ContainerName/ClusterRegion 报 required；InvokeMethod=void 非法
```

> `CreateApplicationTriggerPersonal` 关联 TKE 集群：`RepoName`（`ns/repo`）/`TriggerName`/`InvokeMethod`（`all`|`taglist`|`regex`）/`ClusterId`/`Namespace`（K8s 命名空间）/`WorkloadType`/`WorkloadName`/`ContainerName`/`ClusterRegion`（地域数字 ID，如广州 `1`、成都 `16`）均必填。`InvokeMethod=taglist|regex` 时再传 `--InvokeExpr`。

```bash
# 查询触发器
tccli tcr DescribeApplicationTriggerPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Limit 10
# expected: exit 0, Data

# 修改触发器（InvokeMethod 仍仅 all|taglist|regex）
tccli tcr ModifyApplicationTriggerPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --TriggerName "<TRIGGER_NAME>" --InvokeMethod all
# expected: exit 0

# 查询触发器执行日志
tccli tcr DescribeApplicationTriggerLogPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Limit 10
# expected: exit 0, Data (含触发记录与状态)

# 删除触发器
tccli tcr DeleteApplicationTriggerPersonal --TriggerName "<TRIGGER_NAME>"
# expected: exit 0
```

## 验证

| 维度      | 命令                                                                           | 预期                |
| ------- | ---------------------------------------------------------------------------- | ----------------- |
| 仓库可见性已变 | `DescribeRepositoryFilterPersonal --RepoName <NAMESPACE_NAME>/<REPO_NAME>`   | Public 字段为目标值     |
| 镜像已复制   | `DescribeImageFilterPersonal --RepoName <DEST_NAMESPACE>/<DEST_REPO>`        | 含目标 tag           |
| 全局策略已设  | `DescribeImageLifecycleGlobalPersonal`                                       | StrategyInfo 含新策略 |
| 触发器已建   | `DescribeApplicationTriggerPersonal --RepoName <NAMESPACE_NAME>/<REPO_NAME>` | 含目标触发器            |
| 触发器触发记录 | `DescribeApplicationTriggerLogPersonal`                                      | 有推送后的触发日志         |

## 清理

```bash
# 删除触发器
tccli tcr DeleteApplicationTriggerPersonal --TriggerName "<TRIGGER_NAME>"
# expected: exit 0

# 删除全局生命周期 (无入参)
tccli tcr DeleteImageLifecycleGlobalPersonal
# expected: exit 0

# 批量删除镜像
tccli tcr BatchDeleteImagePersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Tags '["<IMAGE_TAG>"]'
# expected: exit 0
```

> **副作用警告**：批量删除镜像/仓库不可恢复；全局生命周期策略会自动清理所有仓库的旧镜像。

## 故障恢复

| 现象                               | 根因                     | 修复                                                                                 |
| -------------------------------- | ---------------------- | ---------------------------------------------------------------------------------- |
| `DuplicateImagePersonal` 报源镜像不存在 | `SrcImage` 格式错或镜像不存在   | 核对 `<SRC_NAMESPACE>/<SRC_REPOSITORY>:<IMAGE_TAG>`，`DescribeImageFilterPersonal` 确认 |
| 全局策略不生效                          | `Type` 拼错或 `Val` 非法    | 用 `global_keep_last_days`/`global_keep_last_nums`，Val 为正整数                         |
| 触发器创建报集群不存在                      | `ClusterId` 错或无权限      | 核对 TKE 集群 ID 与访问权限                                                                 |
| 触发器未触发部署                         | `InvokeMethod`/工作负载参数错 | 查 `DescribeApplicationTriggerLogPersonal` 看触发记录与错误                                 |
| 仓库改 Public 后仍拉取失败                | 个人版域名用错                | 个人版用 `ccr.ccs.tencentyun.com`                                                      |

## 收尾确认

> 本页覆盖多项操作（查询/复制/生命周期/触发器），按实际配置项选对应确认。下面以触发器+生命周期为例汇总。

```bash
# 汇总核对：触发器已建 + 生命周期策略已设
tccli tcr DescribeApplicationTriggerPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Limit 10 \
  --filter "Data.TriggerInfo[].{name:TriggerName,action:InvokeAction,source:InvokeSource}"
# expected: 含目标触发器（响应字段 TriggerInfo 非 Triggers；集群/工作负载在 InvokePara 中，本 filter 只核对触发器名与触发动作）

tccli tcr DescribeImageLifecycleGlobalPersonal \
  --filter "Data.StrategyInfo[].{type:Type,value:Value}"
# expected: 含设置的策略（如 type=global_keep_last_days；响应字段是 Value，对应入参 Val）

# 端到端：触发器在 push 后产生部署触发记录
tccli tcr DescribeApplicationTriggerLogPersonal --RepoName "<NAMESPACE_NAME>/<REPO_NAME>" --Limit 5 \
  --filter "Data.LogInfo[].{result:InvokeResult,time:InvokeTime}"
# expected: 有触发记录（需先 push 一次镜像才产生日志；InvokeResult 为触发执行结果）
```

> 触发器存在 + 生命周期策略生效 + 触发日志有记录（`InvokeResult` 含 `ReturnCode`/`ReturnMsg`）= 个人版高级管理配置完成。触发器未触发时日志为空，需 push 镜像后查。

***

## 下一步

* [个人版全功能](/tccli/v2/tcr-rong-qi-jing-xiang-fu-wu/index-3/manage.md) — 核心 CRUD（用户/命名空间/仓库/推送）
* [推送拉取镜像](/tccli/v2/tcr-rong-qi-jing-xiang-fu-wu/push-pull.md) — 企业版推送对比
* [故障排查](/tccli/v2/tcr-rong-qi-jing-xiang-fu-wu/troubleshooting.md) — 触发器/复制失败诊断


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://tccli-agent.gitbook.io/tccli/v2/tcr-rong-qi-jing-xiang-fu-wu/index-3/advanced.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
