Не удается получить доступ к переменным конвейера Azure в моем Yaml-файле стека Docker

Я хочу развернуть стек Docker из конвейеров Azure. Я установил несколько переменных и вызываю эти переменные в файле стека Docker. Однако ни одна из моих переменных среды не читается в файле стека докеров. Мой вопрос: есть ли какие-либо объяснения, почему я не могу прочитать переменные среды в файле yaml?

Ниже все мои переменные

введите описание изображения здесь

И вот моя конфигурация стека докеров

version: "3.1"
services:
  postgres:
    image: "postgres"
    volumes:
      - /home/db-postgres:/data/db
    environment:
      POSTGRES_PASSWORD: ${POSTGRESPASSWORD}
      POSTGRES_DB: ${POSTGRESDB}
  main:
    command: "flask run --host=127.0.0.1"
    image: "personal-image"
    ports:
      - 5000:5000
    environment:
      SECRET_KEY: ${FLASK_SERIALIZER_SECRET}
      JWT_SECRET_KEY: ${FLASK_JWT_SECRET}
      FLASK_APP: app.py
      MAIL_USERNAME: ${MAIL_USERNAME}
      MAIL_PASSWORD: ${MAIL_PASSWORD}
      APP_ADMINS: ${APP_ADMINS}
      SQLALCHEMY_DATABASE_URI: ${SQLALCHEMY_DATABASE_URI}

Однако из yaml-файла azure pipeline я могу прочитать переменные среды ...

Я не понимаю, что в другом проекте я делаю то же самое, и все работает нормально.

Изменить: вот мой скрипт azure-pipelines.yml. Агент представляет собой автономный агент EC2 Linux:

steps:
    - bash: |
        echo $(DOCKERREGISTRY_PASSWORD) | docker login --username $(DOCKERREGISTRY_USER) --password-stdin
      displayName: log in to Docker Registry
    
    - bash: |
        sudo service docker start
        sudo docker stack deploy --with-registry-auth --prune --compose-file stack.staging.yml my_cluster_name
      displayName: Deploy Docker Containers
    
    - bash: |
        sudo docker system prune --volumes -f
      displayName: Clean memory
    
    - bash: |
        docker logout
        sudo service docker stop
      displayName: logout of Docker Registry

person Abilys38    schedule 01.09.2020    source источник


Ответы (1)


Вы можете проверить спецификацию агента конвейера yaml в других проектах. Они могут использовать разных агентов.

Я создал тестовый конвейер и обнаружил, что переменные среды в файле стека докеров нельзя заменить в агентах Mac или ubuntu. Но, похоже, он работал в Windows-агентах.

Если вы использовали агенты mac или ubuntu для запуска конвейера. Возможно, вам придется использовать определение переменных среды в поле dockerComposeFileArgs. См. ниже:

- task: DockerCompose@0
  displayName: 'Build services'
  inputs:
    containerregistrytype: 'Container Registry'
    dockerRegistryEndpoint: Dockerhost
    dockerComposeFileArgs: |
     MAIL_USERNAME=$(MAIL_USERNAME)
     MAIL_PASSWORD=$(MAIL_PASSWORD)
     APP_ADMINS=$(APP_ADMINS)
     SQLALCHEMY_DATABASE_URI=$(SQLALCHEMY_DATABASE_URI)
    action: 'Build services'

Обновлять:

Для задачи bash вы можете попробовать поле usig env для сопоставления переменных. См. ниже:

- bash: |
    sudo docker stack deploy ...  
  displayName: 'Bash Script'
  enabled: false
  env:
    MAIL_USERNAME: $(MAIL_USERNAME)
    MAIL_PASSWORD: $(MAIL_PASSWORD)
    APP_ADMINS: $(APP_ADMINS)
person Levi Lu-MSFT    schedule 02.09.2020
comment
Спасибо за интересное замечание. Я отредактировал свое сообщение с помощью сценария azure yml. Вы знаете, как я могу отредактировать его, чтобы сделать то, что вы предлагаете? - person Abilys38; 02.09.2020
comment
Вы можете сопоставить переменные в поле env для задачи bash. См. Выше обновление. - person Levi Lu-MSFT; 02.09.2020
comment
Я попробовал сопоставление в задаче bash, но это тоже не сработало. Есть другие идеи? - person Abilys38; 02.09.2020
comment
Обратите внимание, что я использую некоторые другие переменные среды в начале сценария конвейера Azure, и он работает нормально (для входа в мой реестр) - person Abilys38; 02.09.2020
comment
Может быть, все переменные недоступны или недоступны только секретные переменные? В моем случае переменная секретов недоступна - person Levi Lu-MSFT; 02.09.2020
comment
Нет, это все переменные. - person Abilys38; 02.09.2020