---
url: /zh/artifact/docker.md
description: |
  介绍如何登录和使用 CNB Docker 镜像制品库， 包括制品路径规则、推送和拉取容器镜像的方法。
---
## 登录 CNB Docker 制品库

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

```bash
docker login docker.cnb.cool -u cnb -p ${CNB_TOKEN}
```

## Docker 制品路径规则

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

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

## 推送制品

### 本地命令行推送

同名制品

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

非同名制品

```bash
docker build -t docker.cnb.cool/${CNB_REPO_SLUG_LOWERCASE}/<IMAGE_NAME>:latest .
docker push docker.cnb.cool/${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.cool/<ARTIFACT_PATH>:latest

# ...
```

### 定制构建/开发环境

在 `.cnb.yml` 中引用 CNB 制品库中的 Docker 镜像作为构建环境：

```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+ 客户端。

  如遇到以下错误，请升级 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 协议：

  * 启动参数方式禁用 V1：`dockerd --disable-legacy-registry`（Linux 平台，默认 `false`）
  * 配置文件方式禁用 V1：在 `daemon.json` 中设置 `"disable-legacy-registry": true`（所有平台，默认未设置）

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

## 更多信息

更多 Docker 用法，参阅 [Docker 官方文档](https://docs.docker.com/)。
