Docker 内容信任

Azure Pipelines

Docker 内容信任 (DCT) 提供对发送到远程 Docker 注册表的数据和从远程 Docker 注册表接收的数据的数字签名。 这些签名允许对特定图像标记的完整性和发布服务器进行客户端或运行时验证。

注意

对映像进行签名的先决条件是具有连接 (服务器的 Docker 注册表,如 Docker 中心Azure 容器注册表)

Azure Pipelines 中的签名图像

开发计算机上的先决条件

  1. 使用 Docker 信任的内置生成器或手动生成委托密钥对。 如果使用 内置生成器 ,则会将委托私钥导入到本地 Docker 信任存储区中。 否则,将需要手动将私钥导入到本地 Docker 信任存储区中。 有关详细信息,请参阅 手动生成密钥
  2. 使用在上述步骤中生成的委托密钥,将第一个密钥上载到委托并 启动存储库

提示

若要查看本地委托密钥列表,请使用公证人 CLI 运行以下命令: $ notary key list

设置用于签署图像的管道

  1. 提取委派私钥,此密钥位于先前使用的开发计算机的本地 Docker 信任存储中,并在 Pipelines 中添加与安全文件相同的。

  2. 授权此安全文件 在所有管道中使用。

  3. 与关联的服务主体 containerRegistryServiceConnection 必须具有目标容器注册表中的 AcrImageSigner 角色。

  4. 基于以下 YAML 代码段创建管道:

    pool:
      vmImage: 'Ubuntu 16.04'
    
    variables:
      system.debug: true
      containerRegistryServiceConnection: serviceConnectionName
      imageRepository: foobar/content-trust
      tag: test
    
    steps:
    - task: Docker@2
      inputs:
        command: login
        containerRegistry: $(containerRegistryServiceConnection)
    
    - task: DownloadSecureFile@1
      name: privateKey
      inputs:
        secureFile: cc8f3c6f998bee63fefaaabc5a2202eab06867b83f491813326481f56a95466f.key
    - script: |
        mkdir -p $(DOCKER_CONFIG)/trust/private
        cp $(privateKey.secureFilePath) $(DOCKER_CONFIG)/trust/private
    
    - task: Docker@2
      inputs:
        command: build
        Dockerfile: '**/Dockerfile'
        containerRegistry: $(containerRegistryServiceConnection)
        repository: $(imageRepository)
        tags: |
          $(tag)
        arguments: '--disable-content-trust=false'
    
    - task: Docker@2
      inputs: 
        command: push
        containerRegistry: $(containerRegistryServiceConnection)
        repository: $(imageRepository)
        tags: |
          $(tag)
        arguments: '--disable-content-trust=false'
      env:
        DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: $(DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE)
    

    在上面的示例中, DOCKER_CONFIG 变量由 Docker 任务完成的登录操作设置。 建议将设置 DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE 为管道的 DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE 。 在 YAML 中使用管道变量的另一种方法是以纯文本形式公开通行短语。 在此示例中,我们只需要 "存储库" 密码,因为已 (先决条件) 启动了存储库。