Compose中的环境变量使用Powershell只有1行

时间:2017-11-23 01:01:48

标签: powershell docker-compose powershell-v5.0

我知道您可以将环境变量传递给docker-compose。

搬运工-compose.yml

. . .
mysql:
    image: mariadb:10.2
    ports:
     - "${DB_PORT}:3306"
. . .

$ DB_PORT=3396 docker-compose up

然而,这仅适用于bash。我正在使用PowerShell,并且我正在尝试找到只有一行命令的等价物。

PS> $env:DB_PORT:3306 docker-compose up不起作用。也没有 多

$env:DB_PORT=3396 `
>> docker-compose -up

我得到的错误是 Unexpected token 'docker-compose' in expression or statement.

如果我一次只做一次它确实有用......

PS> $env:DB_PORT=3396
PS> docker-compose -up

当bash中的等价物非常简单时,是否无法在PowerShell中执行此操作?

1 个答案:

答案 0 :(得分:3)

类似POSIX的shell ,例如bash提供了一种命令范围的方式设置环境变量的方法,只需预先添加{{ 1}}成对直接命令,如下例所示:

<varName>=<value>

$ foo=bar bash -c 'echo "[$foo]"'; echo "[$foo]" [bar] [] 仅为foo=bar 子进程定义 environment 变量foo; next 命令 - bash -c '...' - 看到此变量。

PowerShell 无等效构造

您可以做的最好的事情是使用echo ... 单独声明中定义首先感兴趣的环境变量 ,PowerShell的语句分隔符。您之后调用的任何外部实用程序 - 它总是在子进程中运行 - 将会看到它,但请注意环境变量将在当前的PowerShell会话中保持有效,除非您手动删除它

;

请注意# Set the env. variable, call the command that should see it, # remove it afterwards. PS> $env:foo = 'bar'; bash -c 'echo "[$foo]"'; $env:foo = $null [bar] 如何将环境变量设置为$env:foo = $null删除相同;或者,您可以$null

如果您还希望之后恢复预先存在的值

Remove-Item env:foo

以上产量:

$env:foo = 'original'

# Temporarily change $env:foo to a different value, invoke the
# program that should see it, then restore the previous value.
& { $org, $env:foo = $env:foo, 'bar'; bash -c 'echo "[$foo]"'; $env:foo = $org }

$env:foo

显示[bar] original 进程看到临时值bash时,之后恢复了bar的原始值。

另请注意另一个重要区别:

  • POSIX-like shell 中, environment 变量隐式表现为 shell 变量 - 它们共享唯一的命名空间shell有变量。

  • 相比之下, PowerShell 通过$env:foo命名空间(例如$env:<varName>)表示环境变量 ,这与PowerShell自身变量的(无前缀)命名空间(例如,$env:foo)。