Azure管道和docker容器:如何使用运行时参数在运行时选择容器



我正在Microsoft托管代理上的Docker容器中运行Azure管道。容器在我的YAML文件的开头指定:

pool:
vmImage: ubuntu-latest
container: 
image: mycompany.jfrog.io/xyz-docker-local/myimage:debian10
options: --privileged
endpoint: AzureToArtifactory
steps:
- script: |
[...]

结果:运行良好

我定义了第二个容器,称为myimage:ubuntu22。我想使用一个运行时参数在Debian容器和Ubuntu容器之间进行选择。但我无法找出在容器之间切换的正确语法。

首先尝试切换:

由于在微软官方文档或其他地方找不到语法,我选择了一种与其他资源类似的语法。

parameters:
- name: BuildArchitecture
type: string
default: 'x64 ubuntu 22'
values:
- 'x64 ubuntu 22'
- 'x64 debian 10'
pool:
vmImage: ubuntu-latest
container: 
${{ if eq(parameters.buildArchitecture, 'x64 ubuntu 22') }}:
image: mycompany.jfrog.io/xyz-docker-local/myimage:ubuntu22
options: --privileged
endpoint: AzureToArtifactory
${{ else }}:
image: mycompany.jfrog.io/xyz-docker-local/myimage:debian-10
options: --privileged
endpoint: AzureToArtifactory
steps:
[...]

结果:";在此上下文中不允许使用模板表达式">

第二次尝试:

也许压痕是问题所在。

[...]
container: 
${{ if eq(parameters.buildArchitecture, 'x64 ubuntu 22') }}:
image: mycompany.jfrog.io/xyz-docker-local/myimage:ubuntu22
options: --privileged
endpoint: AzureToArtifactory
${{ else }}:
image: mycompany.jfrog.io/xyz-docker-local/myimage:debian-10
options: --privileged
endpoint: AzureToArtifactory
[...]

结果:";在此上下文中不允许使用模板表达式">

第三次尝试:

不缩进。也许它在每个条件表达式的开头都需要-

[...]
container:
- ${{ if eq(parameters.buildArchitecture, 'x64 ubuntu 22') }}:
image: mycompany.jfrog.io/xyz-docker-local/myimage:ubuntu22
options: --privileged
endpoint: AzureToArtifactory
- ${{ else }}:
image: mycompany.jfrog.io/xyz-docker-local/myimage:debian-10
options: --privileged
endpoint: AzureToArtifactory
[...]

结果:";不需要序列">

第四次尝试:

我想也许我需要将容器定义为资源。因此,我创建了容器资源,并验证了当我在没有任何选择逻辑的情况下单独选择资源时,管道是否可以工作。然后我又添加了逻辑:

[...]
resources:
containers:
- container: ubuntu
image: mycompany.jfrog.io/xyz-docker-local/myimage:ubuntu22
options: --privileged
endpoint: AzureToArtifactory
- container: debian
image: mycompany.jfrog.io/xyz-docker-local/myimage:debian-10
options: --privileged
endpoint: AzureToArtifactory
${{ if eq(parameters.buildArchitecture, 'x64 ubuntu 22') }}:
container: ubuntu
${{ else }}:
container: debian
[...]

结果:我们回到了";在此上下文中不允许使用模板表达式">

第五次尝试

也许我应该跳过条件逻辑,把容器标记变成一个变量。

[...]
variables:
- name: dockerTag
${{ if eq(parameters.buildArchitecture, 'x64 ubuntu 22') }}:
value: 'ubuntu22'
${{ else }}:
value: 'debian-10'
container: ubuntu
image: mycompany.jfrog.io/xyz-docker-local/myimage:${{ variables.dockerTag }}
options: --privileged
endpoint: AzureToArtifactory
steps:
[...]

结果:";在此上下文中不允许映射值&";,参考CCD_ 3线。

问题:

在运行时在Docker容器之间进行选择的正确过程或语法是什么?

在运行时在Docker容器之间进行选择的正确过程或语法是什么?

若要使用If表达式和参数来设置容器映像,需要在作业级别定义容器。

例如:

parameters:
- name: BuildArchitecture
type: string
default: 'x64 ubuntu 22'
values:
- 'x64 ubuntu 22'
- 'x64 debian 10'
pool:
vmImage: ubuntu-latest
jobs:
- job:  job1
container:
${{ if eq(parameters.buildArchitecture, 'x64 ubuntu 22') }}:
image:  mycompany.jfrog.io/xyz-docker-local/myimage:ubuntu22
options: --privileged
endpoint: AzureToArtifactory
${{ else }}:
image: mycompany.jfrog.io/xyz-docker-local/myimage:debian-10
options: --privileged
endpoint: AzureToArtifactory
steps:
- script: echo "1"

最新更新