Azure Pipeline 批量构建和推送 docker 图像?
Azure Pipeline to build and push docker images in batch?
我必须提取一堆 docker 图像,在它们上面安装一些根 CA 证书并将它们推送到私有存储库。
我得出的逻辑是:
- 创建模板 docker 文件 (Dockerfile.Template)
- 在管道上,声明所有要拉取的基础镜像
- 运行一一上docker文件替换图片名
- 一推一推
我想出的模板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
分解为 baseImageName
和 tag
... 瞧!
我必须提取一堆 docker 图像,在它们上面安装一些根 CA 证书并将它们推送到私有存储库。
我得出的逻辑是:
- 创建模板 docker 文件 (Dockerfile.Template)
- 在管道上,声明所有要拉取的基础镜像
- 运行一一上docker文件替换图片名
- 一推一推
我想出的模板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
分解为 baseImageName
和 tag
... 瞧!