如何在azure devops管道的docker镜像中嵌入环境变量?

aso*_*ent 5 node.js docker azure-devops

我的要求是在由 azure devops pipeline 构建的 docker 映像上设置一些环境变量。

该管道用于开发/阶段/生产环境,每个阶段都与自己的一组组变量相关联,我希望这些变量在nodejs应用程序中可用。

我可以使用 $VARNAME 读取管道内的变量,但当使用 process.env.VARNAME 运行代码时无法读取相同的变量。

我知道这不是最好的方法,因为图像会有环境变量,这些变量可能有秘密,因此我也愿意接受不同的想法。

到目前为止我已经尝试过:在添加的 dockerfile ARG VARNAME=somevalue 中添加了 ARG

- task: Docker@2
  displayName: Build docker image
  inputs:
    command: build
    repository: $(imageName)
    tags: $(Build.BuildId)        
    buildContext: '$(Pipeline.Workspace)/PublishedWebApp'
    arguments: --build-arg SOMEVAR=anewvalue
Run Code Online (Sandbox Code Playgroud)

我尝试在 nodejs 代码中将其作为 process.env.SOMEVAR 进行访问。

我实际上可以看到在管道中执行的 docker 构建上的 --build-arg 但在代码中它从未出现。

我所追求的是相当标准的要求,我们有多个环境,每个环境都有不同的密钥(不同的组变量绑定到不同的阶段),如何将不同的密钥传递给部署?

Dav*_*rza 2

据我所知,有一些组件需要调整:

  1. 您正在通过 传递密钥--build-arg。这是对的。
  2. ARG在 dockerfile 中有一个用于接收 via 传入的内容--build-arg。这是对的。
  3. 您缺少将环境变量设置为等于传入的参数。
FROM python:3.7-slim

ARG SOME_PASSED_IN_ARG
ENV SOMEVARNAME $SOME_PASSED_IN_ARG
...
Run Code Online (Sandbox Code Playgroud)

SOMEVARNAME可以像process.env.SOMEVARNAME从节点应用程序一样进行访问。

我在@levi-lu-msft 的帖子中表示感谢:/sf/answers/4184914191/

至于最佳实践,在 BUILD 时在容器中定义逻辑默认环境变量是完全可以接受的(例如 ENV=Production)。在运行时,您可以使用传入的参数覆盖任何环境变量:

docker run ... --e SOME_PASSED_IN_ARG=someOtherValue

一些“更好”的做法:

  1. 容器应该是可重复的。不要在构建时嵌入会随时间过期/更改的环境变量。换句话说,如果您决定部署 3 年前的版本,并且构建时间环境变量具有过期值(例如优惠券代码),那么您的环境可能会脆弱且不可预测。
  2. 切勿在构建时将机密嵌入到容器中。上面#1 是因为他们可能会加班并且出于安全考虑而改变。秘密值(例如,一次性密钥、令牌等)可供任何人(不良行为者或事故行为者)简单地通过列出运行时图像的环境变量来提取。