在Windows容器上使用复杂的PowerShell脚本构建Dockerfile

时间:2017-04-02 12:20:28

标签: powershell docker dockerfile docker-windows windows-container

我正在尝试使用运行powershell的dockerfile构建一个docker镜像。嵌入式PowerShell脚本已经在dockerfile之外进行了测试,但是在运行dockerfile时它有错误。

来自docker文件:

RUN powershell -NoProfile -Command " \
$lines = (Get-Content c:\telegraf\telegraf.conf).replace('http://localhost:8086', 'http://publichost.com:8086'); \
Set-Content c:\telegraf\telegraf.conf $lines; \
$lines = (Get-Content c:\telegraf\telegraf.conf).replace('database = "telegraf"', 'database = "qa"'); \
Set-Content c:\telegraf\telegraf.conf $lines \
"

我收到以下错误:

At line:1 char:97
+ ... egraf.conf;     $pos = [array]::indexof($lines, $lines -match  global_ ... 
+                                                                  ~
You must provide a value expression following the '-match' operator.
At line:1 char:97
+ ... egraf.conf;     $pos = [array]::indexof($lines, $lines -match global_ ...
+                                                                  ~
Missing ')' in method call.
At line:1 char:98
+ ...     $pos = [array]::indexof($lines, $lines -match global_tags);          $ ...
+ ~~~~~~~~~~~
Unexpected token 'global_tags' in expression or statement.
At line:1 char:109
+ ...    $pos = [array]::indexof($lines, $lines -match global_tags);         $l ...
+                                                                 ~
Unexpected token ')' in expression or statement.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordEx
ception
+ FullyQualifiedErrorId : ExpectedValueExpression

该脚本的目的是将新内容添加到配置文件

上的特定行

知道语法有什么问题吗?

1 个答案:

答案 0 :(得分:1)

为了解决这个问题,我认为你需要在命令部分添加额外的双引号来替换数据库名称。为了展示一个例子,我在下面粘贴了一个Dockerfile,根据我理解你想要在问题中实现的结果,产生了我所期望的结果。

FROM microsoft/windowsservercore

COPY telegraf.conf C:\\telegraf\\telegraf.conf

RUN powershell -NoProfile -Command " \
$lines = (Get-Content c:\telegraf\telegraf.conf).replace('http://localhost:8086', 'http://publichost.com:8086'); \
Set-Content c:\telegraf\telegraf.conf $lines; \
$lines = (Get-Content c:\telegraf\telegraf.conf).replace('database = """telegraf"""', 'database = """qa"""'); \
Set-Content c:\telegraf\telegraf.conf $lines; \
"

显然我希望你的Dockerfile看起来会有所不同,但是如果你采用我上面使用的例子并在你的字符串中添加额外的双引号,那么你会发现它按预期工作。

有任何问题,请告诉我。