Azure Pipeline 批量构建和推送 docker 图像?

Azure Pipeline to build and push docker images in batch?

我必须提取一堆 docker 图像,在它们上面安装一些根 CA 证书并将它们推送到私有存储库。

我得出的逻辑是:

  1. 创建模板 docker 文件 (Dockerfile.Template)
  2. 在管道上,声明所有要拉取的基础镜像
  3. 运行一一上docker文件替换图片名
  4. 一推一推

我想出的模板docker文件是:

FROM mcr.microsoft.com/dotnet/#{baseImage}# AS base

COPY RootCA-1.crt /usr/local/share/ca-certificates/
COPY RootCA-SubCA-1.crt /usr/local/share/ca-certificates/

RUN update-ca-certificates

天蓝色管道是:

trigger:
- master

parameters:
- name: 'images'
  type: object
  default: 
  - sdk:6.0
  - sdk:5.0
  - sdk:3.1
  - sdk:2.1

pool:
  vmImage: ubuntu-latest

steps:
- ${{ each baseImage in parameters.images }}:

  - bash: |
     echo "current image is $(BASEIMAGE)"

  - task: CopyFiles@2
    inputs:
      Contents: 'Dockerfile.Template'
      TargetFolder: 'Dockerfile'
  - task: replacetokens@4
    inputs:
      targetFiles: 'Dockerfile'
      encoding: 'auto'
      tokenPattern: 'default'
      writeBOM: true
      actionOnMissing: 'warn'
      keepToken: false
      actionOnNoFiles: 'continue'
      enableTransforms: false
      useLegacyPattern: false
      enableTelemetry: true

  - task: Docker@2
    inputs:
      containerRegistry: 'MyPrivateRegistry'
      repository: 'dotnet/$(baseImage)'
      command: 'buildAndPush'
      Dockerfile: '**/Dockerfile'

我目前的问题是替换标记 activity 没有替换 docker activity 的 #{baseImage}#

有人能帮忙吗?

我最后这样做了:

steps:
- ${{ each value in parameters.images }}:
  - bash: echo "##vso[task.setvariable variable=baseImage]${{ value }}"
  - bash: echo "##vso[task.setvariable variable=tag]${{ replace(replace(replace(value,'sdk:',''),'runtime:',''),'aspnet:','') }}"
  - bash: echo "##vso[task.setvariable variable=baseImageName]${{ replace(replace(value,replace(replace(replace(value,'sdk:',''),'runtime:',''),'aspnet:',''),''),':','') }}"
  - bash: |
     echo "current image is $(baseImageName) and tag is $(tag)"
  
  - task: CopyFiles@2
    inputs:
      SourceFolder: 'DockerfileTemplate'
      Contents: 'Dockerfile'
      TargetFolder: '$(Build.SourcesDirectory)'
      OverWrite: true

  - task: replacetokens@4
    inputs:
      targetFiles: 'Dockerfile'
      encoding: 'auto'
      tokenPattern: 'default'
      writeBOM: true
      actionOnMissing: 'warn'
      keepToken: false
      actionOnNoFiles: 'continue'
      enableTransforms: false
      useLegacyPattern: false
      enableTelemetry: true

  - task: Docker@2
    inputs:
      containerRegistry: 'MyPrivateRegistry'
      repository: 'dotnet/$(baseImageName)'
      command: 'buildAndPush'
      Dockerfile: 'Dockerfile'
      tags: '$(tag)'
    continueOnError: true

基本上我将模板 dockerfile 移动到一个子文件夹并重命名为 Dockerfile。然后我将 baseImage 分解为 baseImageNametag... 瞧!