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 变量 foo
; next 命令 - 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
)。
我知道您可以将环境变量传递给 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 变量 foo
; next 命令 - 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
)。