我知道你可以将环境变量传递给 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 的 shell 例如 bash
提供一种以命令范围方式设置环境变量的方法,只需在前面添加 <varName>=<value>
直接与命令配对,如以下示例所示:
$ foo=bar bash -c 'echo "[$foo]"'; echo "[$foo]"
[bar]
[]
foo=bar
定义环境变量 foo
对于bash -c '...'
仅子进程; 下一个命令 - echo ...
- 没有看到这个变量。
PowerShell 具有没有等效结构。
您能做的最好的事情就是首先在单独的语句中定义感兴趣的环境变量,使用 ;
,PowerShell 的语句分隔符。此后您调用的任何外部实用程序(始终在子进程中运行)都会看到它,但请注意,环境变量将在当前 PowerShell session 中保持有效,除非您手动将其删除:
# 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 的 shell 中,环境 变量隐式地显示为 shell 变量 - 它们共享唯一的命名空间shell 有 for 变量。
相比之下,PowerShell仅通过
$env:<varName>
显示环境变量命名空间(例如$env:foo
),与 PowerShell 自身变量的(无前缀)命名空间(例如$foo
)不同。
关于powershell - 使用 Powershell 编写的环境变量仅需 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47446092/