Can';t访问我的Docker堆栈Yaml文件中的Azure管道变量

Can';t访问我的Docker堆栈Yaml文件中的Azure管道变量,azure,docker,azure-devops,azure-pipelines,Azure,Docker,Azure Devops,Azure Pipelines,我想从Azure管道部署Docker堆栈。我设置了一些变量,并在Docker堆栈文件中调用这些变量。但是,docker堆栈文件中没有读取我的环境变量我的问题:有没有解释为什么我不能读取yaml文件中的环境变量? 下面是我所有的变量 这是我的docker堆栈配置 version: "3.1" services: postgres: image: "postgres" volumes: - /home/db-postgres:

我想从Azure管道部署Docker堆栈。我设置了一些变量,并在Docker堆栈文件中调用这些变量。但是,docker堆栈文件中没有读取我的环境变量我的问题:有没有解释为什么我不能读取yaml文件中的环境变量?

下面是我所有的变量

这是我的docker堆栈配置

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}

从azure管道yaml文件中,我可以读取环境变量

我不明白的是,在另一个项目中,我正在做完全相同的事情,而且一切都很好

编辑:这是我的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

您可以在其他项目中检查yaml管道的代理规范。他们可能会使用不同的代理

我创建了一个测试管道,发现docker堆栈文件中的环境变量无法在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: |
    sudo docker stack deploy ...  
  displayName: 'Bash Script'
  enabled: false
  env:
    MAIL_USERNAME: $(MAIL_USERNAME)
    MAIL_PASSWORD: $(MAIL_PASSWORD)
    APP_ADMINS: $(APP_ADMINS)
更新:

对于bash任务,您可以尝试使用env字段映射变量。见下文:

- 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: |
    sudo docker stack deploy ...  
  displayName: 'Bash Script'
  enabled: false
  env:
    MAIL_USERNAME: $(MAIL_USERNAME)
    MAIL_PASSWORD: $(MAIL_PASSWORD)
    APP_ADMINS: $(APP_ADMINS)

这回答了你的问题吗?不我认为我在docker堆栈文件中设置变量的方式很好,因为它在其他项目中工作。然而,我感觉我的变量不能从Docker文件中访问,这是这个项目非常特殊的一点。谢谢你有趣的评论。我用azure yml脚本编辑了我的邮件。您知道我如何按照您的建议编辑它吗?您可以在bash任务的
env
字段中映射变量。请参阅上面的更新。我在bash任务中尝试了映射,但也没有成功。还有其他想法吗?请注意,我在azure管道脚本的开始部分使用了一些其他环境变量,它工作正常(登录到我的注册表),是因为所有变量都无法访问,还是仅机密变量无法访问?在我的例子中,secrets变量似乎无法访问