How to set environment variables in Dockerfile via Azure DevOps

Pal*_*lBo 5 azure docker dockerfile azure-devops

In my projects Docker file I have some environment variables, like this:

ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=Password
ENV MSSQL_PID=Developer
ENV MSSQL_TCP_PORT=1433 
Run Code Online (Sandbox Code Playgroud)

And I would like to pass the password here as an environment variable set in my pipeline.

In Azure DevOps I have two pipelines. One for building the solution and one for building and pushing docker images to DockerHub. There are options to set variables in both these pipelines: 在此处输入图片说明 在此处输入图片说明 我已经在两个管道中设置了密码,并在 Dockerfile 中编辑了我的密码,如下所示:

ENV SA_PASSWORD=$(SA_PASSWORD)
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。将环境变量从 Azure DevOps 传递到 Docker 映像的正确方法是什么?

另外,这是传递秘密的安全方式吗?有什么办法可以从 Docker 镜像中读取机密?

谢谢!

Lev*_*SFT 8

您可以设置一个ARG var_name并引用 ENV 到 ARG 变量。然后你可以在 docker 构建镜像时替换这些变量$ docker build --build-arg var_name=$(VARIABLE_NAME)

例如在 dockerfile 中添加 ARG,并让 ENV 变量引用它:

ARG SECRET
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=$SECRET
ENV MSSQL_PID=Developer
ENV MSSQL_TCP_PORT=1433 
Run Code Online (Sandbox Code Playgroud)

您可以单独使用停靠构建任务和停靠推送任务,因为 buildandpush 命令不能接受参数。并SECRET在您的管道中设置一个变量。

在此处输入图片说明

设置 Build ArgumentsSECRET= $(SECRET)以替换 ARG SECRET

在此处输入图片说明

您也可以参考一个类似的线程

  • 根据您的秘密的“秘密”程度,将它们烘焙到任何图像中对于安全性来说并不是很好。按照 @Rémi 的建议在运行时传递它们 (3认同)

sil*_*ent 3

我正在使用替换令牌扩展来执行如下任务: https: //marketplace.visualstudio.com/items?itemName =qetza.replacetokens

然而,将秘密放入 Dockerfile 中可能不是最好的主意。通常,当您实际执行容器时,您会提供机密或一般运行时配置作为环境变量。