Pass variable build args to docker build command

Viewed 506

Here is the docker stage:

  - template: ../docker-template.yml
    parameters:
      buildArgs:
        - name: Arg1
          value: $(arg1-value)
        - name: Arg2
          value: $(arg2-value)

docker-template.yml

parameters:
  buildArgs: []
stages:
  - stage: Docker
    displayName: Docker Stage
    jobs:
    - job: Docker

      steps:
      # - ${{ each arg in parameters.buildArgs }}:
      #   - bash: |
      #       buildArgString+=' --build-arg ${{arg.name}}=${{arg.value}}'
      #     displayName: "Getting Params"

      - bash: |
          ${{ each arg in parameters.buildArgs }}:
            buildArgString+=' --build-arg ${{arg.name}}=${{arg.value}}'
          echo 'buildstring=$buildArgString'
        displayName: 'build string'

      - bash: |
          cd $(sourceDirectory)
          docker build \
              -t $(registryName)/$(imageName):$(imageTag) \
              $buildArgString \
              .
        failOnStderr: true
        displayName: 'docker build'

Here I want to construct buildArgString based on the parameters passed and pass it to docker build command as shown. When I use this I get error

The directive 'each' is not allowed in this context. Directives are not supported for expressions that are embedded within a string. Directives are only supported when the entire value is an expression.

Any suggestions?

1 Answers

As the message mentioned, you are using each in a wrong place. Try with below script sample:

azure-pipelines.yml:

extends:
  template: docker-template.yml
  parameters:
    buildArgs:  
      Arg1 : $(arg1-value)
      Arg2 : $(arg2-value)

docker-template.yml:

parameters:
- name: buildArgs 
  type: object
  default: [] 
stages:
  - stage: Docker
    displayName: Docker Stage
    jobs:
    - job: Docker
      steps:
      - ${{ each arg in parameters.buildArgs }}:
        - bash: |
            echo ${{ arg.key }}
            echo ${{ arg.value }}
            echo "##vso[task.setvariable variable=buildArgStringOther]--build-arg ${{ arg.key }}=${{ arg.value }}"
          displayName: ${{ arg.key }}
        - bash: |
            echo "buildstring=$(buildArgStringOther)"
          displayName: ECHO-${{ arg.key }}

enter image description here

Related