关于 container-registries
面向开发者和平台团队的容器镜像注册表操作技能,涵盖云端及自托管方案,从认证、镜像传输到保留策略与安全配置。
主要功能
- 01Docker Hub、ECR、ACR 等注册表操作
- 02镜像推送与拉取
- 03注册表认证配置
- 04生命周期与保留策略
- 05漏洞扫描与镜像签名
适用场景
- 01在不同注册表间分发镜像
- 02为私有注册表配置访问
- 03设置镜像清理与保留规则
- 04为镜像启用安全检查与签名
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill container-registries安装后在 Claude Code 中输入/container-registries确认已加载。
详细介绍
容器注册表
在云端和自托管注册表中存储、管理和分发容器镜像。
何时使用此技能
在以下场景中使用此技能:
- 推送和拉取容器镜像
- 配置注册表身份验证
- 设置镜像保留策略
- 管理私有容器注册表
- 实施镜像扫描和安全措施
前提条件
- 已安装 Docker 或 Podman
- 对应注册表的云 CLI 工具(AWS CLI、az、gcloud)
- 适当的 IAM 权限
Docker Hub
身份验证
# Login
docker login
# Login with token
echo "$DOCKER_TOKEN" | docker login -u username --password-stdin
推送/拉取镜像
# Tag image
docker tag myapp:latest username/myapp:latest
# Push
docker push username/myapp:latest
# Pull
docker pull username/myapp:latest
自动构建
在 Docker Hub 界面中配置:
- 连接 GitHub/Bitbucket 仓库
- 设置构建规则(分支 → 标签映射)
- 配置构建上下文和 Dockerfile 路径
Amazon ECR
设置
# Create repository
aws ecr create-repository \
--repository-name myapp \
--image-scanning-configuration scanOnPush=true \
--encryption-configuration encryptionType=AES256
# Get registry URI
REGISTRY=$(aws ecr describe-repositories \
--repository-names myapp \
--query 'repositories[0].repositoryUri' \
--output text | cut -d'/' -f1)
身份验证
# Login (Docker)
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin $REGISTRY
# Login with credential helper
# Add to ~/.docker/config.json:
{
"credHelpers": {
"123456789.dkr.ecr.us-east-1.amazonaws.com": "ecr-login"
}
}
推送/拉取
# Tag and push
docker tag myapp:latest $REGISTRY/myapp:latest
docker push $REGISTRY/myapp:latest
# Pull
docker pull $REGISTRY/myapp:latest
生命周期策略
# Create lifecycle policy
aws ecr put-lifecycle-policy \
--repository-name myapp \
--lifecycle-policy-text '{
"rules": [
{
"rulePriority": 1,
"description": "Keep last 10 images",
"selection": {
"tagStatus": "any",
"countType": "imageCountMoreThan",
"countNumber": 10
},
"action": {
"type": "expire"
}
}
]
}'
仓库策略
# Allow cross-account access
aws ecr set-repository-policy \
--repository-name myapp \
--policy-text '{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CrossAccountPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::OTHER_ACCOUNT:root"
},
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
]
}
]
}'
Azure Container Registry (ACR)
设置
# Create registry
az acr create \
--resource-group mygroup \
--name myregistry \
--sku Standard \
--admin-enabled false
# Get login server
az acr show --name myregistry --query loginServer -o tsv
身份验证
# Login with Azure CLI
az acr login --name myregistry
# Login with service principal
docker login myregistry.azurecr.io \
-u $SP_APP_ID \
-p $SP_PASSWORD
# Get access token
az acr login --name myregistry --expose-token
推送/拉取
# Tag and push
docker tag myapp:latest myregistry.azurecr.io/myapp:latest
docker push myregistry.azurecr.io/myapp:latest
# ACR Build (build in cloud)
az acr build \
--registry myregistry \
--image myapp:latest \
--file Dockerfile .
保留策略
# Enable retention policy
az acr config retention update \
--registry myregistry \
--status enabled \
--days 30 \
--type UntaggedManifests
地理复制
# Enable replication
az acr replication create \
--registry myregistry \
--location westeurope
# List replications
az acr replication list --registry myregistry
Google Container Registry (GCR) / Artifact Registry
设置(Artifact Registry)
# Create repository
gcloud artifacts repositories create myrepo \
--repository-format=docker \
--location=us-central1 \
--description="Docker repository"
身份验证
# Configure Docker auth
gcloud auth configure-docker us-central1-docker.pkg.dev
# Or use credential helper
gcloud auth print-access-token | \
docker login -u oauth2accesstoken --password-stdin \
https://us-central1-docker.pkg.dev
推送/拉取
# Tag for Artifact Registry
docker tag myapp:latest \
us-central1-docker.pkg.dev/PROJECT_ID/myrepo/myapp:latest
# Push
docker push us-central1-docker.pkg.dev/PROJECT_ID/myrepo/myapp:latest
# Pull
docker pull us-central1-docker.pkg.dev/PROJECT_ID/myrepo/myapp:latest
清理策略
# Create cleanup policy
gcloud artifacts repositories set-cleanup-policies myrepo \
--location=us-central1 \
--policy=policy.json
# policy.json
{
"name": "delete-old",
"action": {"type": "Delete"},
"condition": {
"olderThan": "30d",
"tagState": "untagged"
}
}
GitHub Container Registry (GHCR)
身份验证
# Login with PAT
echo "$GITHUB_TOKEN" | docker login ghcr.io -u USERNAME --password-stdin
推送/拉取
# Tag
docker tag myapp:latest ghcr.io/OWNER/myapp:latest
# Push
docker push ghcr.io/OWNER/myapp:latest
# Pull
docker pull ghcr.io/OWNER/myapp:latest
可见性设置
在 GitHub 中配置:
- 前往软件包设置
- 更改可见性(公开/私有)
- 管理团队/用户的访问权限
自托管注册表
使用 Docker 部署
# Run registry
docker run -d -p 5000:5000 \
--name registry \
-v registry-data:/var/lib/registry \
registry:2
# Configure TLS
docker run -d -p 443:5000 \
--name registry \
-v /certs:/certs \
-v registry-data:/var/lib/registry \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
Harbor 注册表
# Download Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-online-installer-v2.9.0.tgz
tar xzvf harbor-online-installer-v2.9.0.tgz
# Configure harbor.yml
# Set hostname, https certificate, admin password
# Install
./install.sh --with-trivy --with-chartmuseum
镜像安全
漏洞扫描
# ECR - Enable scan on push
aws ecr put-image-scanning-configuration \
--repository-name myapp \
--image-scanning-configuration scanOnPush=true
# Get scan results
aws ecr describe-image-scan-findings \
--repository-name myapp \
--image-id imageTag=latest
# ACR - Scan with Defender
az acr task create \
--registry myregistry \
--name scan-images \
--cmd "mcr.microsoft.com/azure-cli az acr run-scan"
镜像签名
# Enable content trust
export DOCKER_CONTENT_TRUST=1
# Sign image on push
docker push myregistry/myapp:latest
# Verify signature
docker trust inspect myregistry/myapp:latest
常见问题
问题:身份验证已过期
问题:推送/拉取时出现身份验证错误 解决方案:重新运行登录命令,检查凭据助手
问题:找不到镜像
问题:拉取时出现 manifest unknown 错误 解决方案:确认标签存在,检查注册表 URL
问题:推送权限被拒绝
问题:无法推送到仓库 解决方案:检查 IAM 权限,确认仓库存在
问题:请求速率受限(Docker Hub)
问题:出现请求过多错误 解决方案:进行身份验证以提高限制,使用拉取穿透缓存
最佳实践
- 为所有仓库启用漏洞扫描
- 实施生命周期策略以管理存储成本
- 为生产镜像使用不可变标签
- 配置跨区域复制以确保可用性
- 使用服务账户/主体进行 CI/CD 身份验证
- 启用审计日志以满足合规要求
- 实施镜像签名以保障供应链安全
- 使用拉取穿透缓存以避免速率限制
相关技能
- docker-management - 构建镜像
- container-scanning - 安全扫描
- aws-iam - AWS 权限
评论
支持 Markdown