Docker - 传递参数 - 语法问题

时间:2018-04-05 20:10:03

标签: docker docker-compose dockerfile docker-windows

我想知道我应该使用什么语法来echo传递给docker的ARG。

我还想知道语法,以便将ARG传递给powershell命令。这是我的尝试:

在我的dockerfile中,我定义了一个ARG:

FROM microsoft/aspnet
ARG web_connection_string

RUN echo " $web_connection_string."

ADD ./setup.ps1 /setup.ps1
RUN powershell -NoProfile -File C:\setup.ps1 -websiteDir "C:/inetpub/wwwroot" -webConnectionString $web_connection_string

setup.ps1如下所示:

param(
    [Parameter(Mandatory = $true)]
    [string]$websiteDir,
    [Parameter(Mandatory = $true)]
    [string]$webConnectionString      
);

$sb = New-Object System.Data.Common.DbConnectionStringBuilder
$sb.set_ConnectionString($webConnectionString)

[xml]$config = Get-Content "$pathToWebConfig"
$config.configuration.connectionStrings.GetElementsByTagName("add") `
    | Where-Object { $_.name -eq 'SiteSqlServer' } `
    | ForEach-Object { $_.connectionString = $sb.ConnectionString; }
$config.Save("$websiteDir/web.config")

我的docker-compose.yml:

version: '3'
services:
  web:
    image: "dnn-site"
    build: 
      context: .\
      dockerfile: Dockerfile
      args:                                                                      
        web_connection_string: 'Server=db;Database=${dnn_database_name};User ID=${dnn_database_user_name};Password=${dnn_database_user_password};' 

您在此处使用$()语法看到的值位于与我运行docker-compose命令的docker-compose.yml相同的目录中的“.env”文件中。 docker-compose替换这些值。

当我docker-compose up时,我看到了这个输出:

在输出中我看到:

Step 1/13 : FROM microsoft/aspnet
 ---> dc3f4d701ead
Step 2/13 : ARG web_connection_string
 ---> Using cache
 ---> 79fea0b34b8d
Step 3/13 : RUN echo " $web_connection_string."
 ---> Running in 7a3552cedc92
.

请注意,$ web_connection_string似乎是空的。这是由于我回应它的方式吗?或者它是空的(即我的docker-compose.yml是错误的?)

另外我将值作为param传递给setup.ps1脚本的方式是正确的语法吗?

1 个答案:

答案 0 :(得分:0)

我一直在尝试更多。 似乎ARG传入Docker构建,可以使用:

在powershell中访问
$Env:ARGNAME

例如:

FROM microsoft/aspnet
ARG web_connection_string

RUN echo " $Env:web_connection_string."

因此,调用powershell脚本并将其作为参数传递:

RUN powershell -NoProfile -File C:\setup.ps1 -myparameter $Env:web_connection_string 

请注意,这似乎只适用于ARG。如果你使用这样的ENV值:

FROM microsoft/aspnet
ENV web_connection_string

您正在使用docker-compose.yml的environment部分解析相关的环境值

web: 
    image: "dnn-web"
    build: 
      context: .\
      dockerfile: Dockerfile 
    environment:
        web_connection_string: '${some_foo_from_dot_env_file}'

然后以下似乎不起作用,因为它似乎只适用于ARG值。

RUN echo" $ ENV:web_connection_string"

输出