---
url: /zh/build/showcache/docker-build-and-push-to-cnb-artifact.md
---
本文将介绍如何在流水线中构建Docker镜像，并推送到Docker制品库。

## 上传到CNB Docker制品库

CNB流水线中内置了流水线触发者的访问凭据，可以直接用于登录并上传CNB Docker制品库。

配置文件示例：

```yaml title=".cnb.yml"
main:
  push:
    - services:
        - docker #声明后，流水线内可以直接使用docker命令
      stages:
        - name: set docker tag
          script: echo -n "${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest"
          exports:
            info: IMAGE_TAG

        - name: docker build
          script: docker build -t $IMAGE_TAG .

        - name: push image
          script: docker push $IMAGE_TAG
```

## 上传到官方或其他Docker制品库

对于上传到官方或其他Docker制品库，可以将DOCKER凭证存放到一个密钥仓库中，然后在流水中通过[imports](../grammar.md#pipeline-imports)语法导入。

配置文件示例：

```yaml title=".cnb.yml"
main:
  push:
    - services:
        - docker #声明后，流水线内可以直接使用docker命令
      # 从一个密钥仓库里，导入DOCKER凭证到环境变量
      imports: https://cnb.share.ralphlauren.cn/<your-repo-slug>/-/blob/main/xxx/docker-envs.yml
      stages:
        - name: set docker tag
          script: echo -n "${DOCKER_REGISTRY}/${DOCKER_GROUP}$/${DOCKER_REPO_NAME}$:$CNB_COMMIT_SHORT"
          exports:
            info: IMAGE_TAG

        - name: docker login
          script: docker login -u ${DOCKER_USER} -p "${DOCKER_PWD}" ${DOCKER_REGISTRY}

        - name: docker build
          script: docker build -t $IMAGE_TAG .

        - name: push image
          script: docker push $IMAGE_TAG
```

docker-envs.yml

```yaml
DOCKER_USER: user
DOCKER_PWD: password
DOCKER_REGISTRY: docker.io
DOCKER_GROUP: group_name
DOCKER_REPO_NAME: repo_name
```
