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

Environment variables in Compose using Powershell with only 1 line

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

docker-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 中执行此操作?

POSIX-like shells 例如 bash 提供了一种在 中设置环境变量的方法 command-scoped 方式,只需将 <varName>=<value> pairs 直接添加到命令前,如以下示例所示:

$ foo=bar bash -c 'echo "[$foo]"'; echo "[$foo]"
[bar]
[]

foo=bar 仅为 bash -c '...' 子进程 定义 environment 变量 foonext 命令 - echo ... - not 是否看到此变量。


PowerShell 没有等效的构造

你能做的最好的事情是首先定义感兴趣的环境变量,在单独的语句中,使用 ;,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 时,$env:foo 的原始值随后被恢复。


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

  • POSIX-like shells中,environment变量隐式浮出水面作为 shell 变量 - 它们共享 shell 变量唯一的命名空间。

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