繁体   English   中英

DevOps 和 Azure 应用服务中的环境变量

[英]Environment Variables in DevOps and Azure App Service

我目前正在努力通过我的 DevOps 部署管道将环境变量持久化到 Azure 应用服务。

我正在使用 Docker 容器和 Azure 的容器注册表在 Azure 应用服务上部署 Django 应用。 这些容器基于 Azure DevOps 构建,并通过发布管道推送到注册表。 我需要对一些环境变量保密,因为该应用程序将连接到我们的 Azure Cosmos DB,而我是通过使用 tokenized.env 文件来实现的。 这些变量是保密的,并在构建期间使用管道变量和替换令牌DevOps 任务添加到我的“.env-prod”文件中。

这是我的“.env-prod”文件的样子:

PRODUCTION_KEY=#{{PRODUCTION_KEY}}#
AZURE_DB=#{{AZURE_DB}}#
AZURE_CONNECT=#{{AZURE_CONNECT}}#
...

在 DevOps 的构建过程中,令牌被正确替换,构建执行时没有错误,将容器推送到我们的 Azure 容器注册表。

现在,当我通过 docker 撰写脚本在 App Service 上启动应用程序时,问题就出现了,该脚本也用于构建容器。 这是我的 compose 文件中的后端服务,它构建并运行 Django 应用程序:

backend-service:
  env_file: backend_folder/.env-prod
  build: backend_folder
  # Container registry name in Azure
  image: **.azurecr.io/**:0.1.1
  volumes:
    - static:/app/static
  command: gunicorn django_proj.wsgi:application --chdir django_proj --bind 0.0.0.0:8001
  expose:
    - 8001

static 文件是通过CMD python manage.py collectstatic --no-input命令在我的 ZC5FD214CDD0D2B3B42ZE 文件中创建的。 还有一个 nginx 和一个前端服务来为我们的网站提供服务,但它们不引用 .env 文件。

当我启动我的应用服务时,启动应用时变量似乎没有加载到后端服务。 我还在应用服务中的应用程序设置中添加了相同的变量,但我仍然遇到错误,表明未设置变量。

这是来自我的容器日志 stream 的快照,它描述了错误:

2021-06-02 INFO - 来自后端服务的容器日志 = 2021-06-02 [2021-06-02] [INFO] 启动 gunicorn 20.1.0 2021-06-02 [2021-06-02] [INFO] 监听在: http://0.0.0.0:8001 (1) 2021-06-02T2 [2021-06-02] [6] [错误] 工作进程中的异常 2021-06-02 Traceback(最近一次调用最后):

...

2021-06-02 文件“/app/django_proj/settings.py”,第 116 行,在 <module>

2021-06-02 连接(os.environ['AZURE_DB'],主机=os.environ['AZURE_CONNECT'])

...

2021-06-02 pymongo.errors.InvalidURI:无效的 URI 方案:URI 必须以“mongodb://”或“mongodb+srv://”开头

似乎我的AZURE_CONNECT变量没有在我们正在运行的应用服务后端容器中设置。

  1. 如何在撰写脚本中安全地保留秘密环境变量,以便它们在 Azure DevOps 中的构建步骤和 Azure 应用程序服务中的运行步骤中都存在?
  2. 是否有另一种方法可以通过 gunicorn 为 static 文件提供服务,以便仅在构建步骤而不是在启动应用服务时引用环境变量?

这是我发现的与我的问题最接近的相关问题,但我们的不同之处在于我们在 Azure 应用服务而不是 Heroku 上使用多个环境变量。 此外,如果我在没有令牌的情况下使用我的 private.env 文件,我在本地计算机上运行该站点也没有问题。

感谢 Josh Gordon 的帮助,我了解到我不应该使用引号格式化 Azure 应用程序服务应用程序设置 - 原始文本作为字符串加载到环境中并且不需要预期的引号。

在我的问题中,我也在寻找一种通过管道持久化环境变量的方法。 我想这可以通过在管道和应用程序服务的应用程序设置中设置相同的变量来完成,但我也能够通过替换 Dockerfile 中的行来避免在部署管道中使用环境变量

RUN python manage.py collectstatic --no-input

CMD python manage.py collectstatic --no-input

现在构建和推送步骤不需要加载的环境变量,我在应用服务中正确加载了环境变量。 再次感谢,乔希。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM