---
url: /zh/artifact/docker.md
---
## 登录 CNB Docker 制品库

登录命令如下。如何获取 `CNB_TOKEN` 请参考[创建访问令牌](./intro.md#创建访问令牌)。

```bash
docker login docker.cnb.share.ralphlauren.cn -u cnb -p ${CNB_TOKEN}
```

## Docker 制品路径规则

制品在发布到某一仓库时，支持两种命名规则

1. 同名制品 - 制品路径与仓库路径一致，如：`docker.cnb.share.ralphlauren.cn/${CNB_REPO_SLUG_LOWERCASE}`
2. 非同名制品 - 仓库路径作为制品的命名空间，制品路径=仓库路径/制品名称，如：`docker.cnb.share.ralphlauren.cn/${CNB_REPO_SLUG_LOWERCASE}/<IMAGE_NAME>`

## 推送制品

### 本地命令行推送

同名制品

```bash
docker build -t docker.cnb.share.ralphlauren.cn/${CNB_REPO_SLUG_LOWERCASE}:latest .
docker push docker.cnb.share.ralphlauren.cn/${CNB_REPO_SLUG_LOWERCASE}:latest
```

非同名制品

```bash
docker build -t docker.cnb.share.ralphlauren.cn/${CNB_REPO_SLUG_LOWERCASE}/<IMAGE_NAME>:latest .
docker push docker.cnb.share.ralphlauren.cn/${CNB_REPO_SLUG_LOWERCASE}/<IMAGE_NAME>:latest
```

### 云原生构建中推送

```yaml title=".cnb.yml"
main:
  push:
    - services:
        - docker
      stages:
        - name: docker build
          script: docker build -t ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest .
        - name: docker push
          script: docker push ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
```

### 云原生开发中推送

同名制品

```bash
docker build -t ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest .
docker push ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
```

非同名制品

```bash
docker build -t ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}/<IMAGE_NAME>:latest .
docker push ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}/<IMAGE_NAME>:latest
```

## 使用制品

### 在命令行使用

```bash
docker pull docker.cnb.share.ralphlauren.cn/<ARTIFACT_PATH>:latest

# ...
```

### 定制云原生构建环境

```yaml{4} title=".cnb.yml"
main:
  push:
    - docker:
        image: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
      stages:
        - name: hello world
          script: echo "Hello World"
```

### 定制云原生开发环境

```yaml{4} title=".cnb.yml"
$:
  vscode:
    - docker:
        image: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
      services:
        - vscode
        - docker
```

## 限制

* 单层最大限制 64 GB
* 镜像最大限制 64 层
* 制品元数据最大限制 64 KB
* 不支持 Docker Registry V1 API，请使用 Docker 20.10+ 客户端。较老版本（如 1.13.1）虽然支持 V2 协议，但对于非 Docker Hub 的 Registry 会默认同时生成 V1 和 V2 端点，并在 V2 请求失败时自动回退到 V1，导致请求被拒绝。如果遇到以下错误，请升级 Docker 版本：

  ```text
  Error: image <IMAGE_NAME> not found
  ```

  ```text
  Failed to pull image: rpc error: code = Unknown desc = missing signature key
  ```

  如果确实需要使用较老版本的 Docker（17.12 以下），需手动禁用 V1 协议：

  | 配置方式 | 适用平台 | 默认值 | 说明 |
  |---------|---------|-------|------|
  | `dockerd --disable-legacy-registry` | Linux | `false` | 启动参数方式禁用 V1 |
  | `daemon.json` 中设置 `"disable-legacy-registry": true` | 所有平台 | 未设置 | 配置文件方式禁用 V1 |

  > 注意：Windows/macOS 平台会自动强制使用 V2 协议，无需额外配置。该选项在 Docker 17.12+ 中已移除，因为 V1 支持被彻底删除。

## 更多用法

更多 Docker 用法，请查阅官方文档
