来自 docker-compose.yaml 的来源 OS 环境变量
Source OS environment variables from a docker-compose.yaml
我想以在容器中调用脚本的方式调用脚本。因此我必须设置几个环境变量。有没有办法导出 docker-compose.yaml 的所有列出的环境变量,以便它们在我的 shell 中用作后续命令的变量?
假设我使用这个 docker-compose.yaml
:
version: "3.8"
services:
my-service:
image: some-image
build:
context: .
dockerfile: Dockerfile
environment:
var1: test
var2: 1
# var3: test # Some comment
command: echo $var1 $var2 $var3
使用yq 很容易解析相关变量,但我不确定如何导出每个变量。评论等特殊情况也可能是个问题。
到目前为止我得到了什么:cat ~/docker-compose.yaml| yq .services.my-service.environment
哪个 return:
var1: test
var2: 1
# var3: test # Some comment
通过使用 kislyuk/yq (instead of mikefarah/yq), which is a YAML wrapper for the JSON processor stedolan/jq,您可以利用 jq 的 @sh
函数拼凑一些 export
语句,然后您可以从 shell.[=18 获取这些语句=]
bash中的示例:
$ source <(yq -r '
.services."my-service".environment
| to_entries[] | "export \(.key)=\(.value | @sh)"
' docker-compose.yaml)
$ echo $var1
test
$ echo $var2
1
$ echo $var3 # not fetched because it was commented out
在 POSIX sh 中,由于未定义进程替换,您可能会改用临时文件:
$ yq -r '
.services."my-service".environment
| to_entries[] | "export \(.key)=\(.value | @sh)"
' docker-compose.yaml > docker-compose.sh
$ cat docker-compose.sh
export var1='test'
export var2=1
$ . docker-compose.sh
$ echo $var1 $var2 $var3
test 1
此外,如果您的最终目标只是在给定环境中执行同样存储在 YAML 文件中的命令,而变量不会导出到外部 shell,则删除 export
,在脚本末尾添加.command
的内容,不要source而是执行脚本:
$ var1=old_value
$ yq -r '
.services."my-service"
| (.environment | to_entries[] | "\(.key)=\(.value | @sh)")
, .command
' docker-compose.yaml | sh
test 1
$ echo $var1
old_value
我想以在容器中调用脚本的方式调用脚本。因此我必须设置几个环境变量。有没有办法导出 docker-compose.yaml 的所有列出的环境变量,以便它们在我的 shell 中用作后续命令的变量?
假设我使用这个 docker-compose.yaml
:
version: "3.8"
services:
my-service:
image: some-image
build:
context: .
dockerfile: Dockerfile
environment:
var1: test
var2: 1
# var3: test # Some comment
command: echo $var1 $var2 $var3
使用yq 很容易解析相关变量,但我不确定如何导出每个变量。评论等特殊情况也可能是个问题。
到目前为止我得到了什么:cat ~/docker-compose.yaml| yq .services.my-service.environment
哪个 return:
var1: test
var2: 1
# var3: test # Some comment
通过使用 kislyuk/yq (instead of mikefarah/yq), which is a YAML wrapper for the JSON processor stedolan/jq,您可以利用 jq 的 @sh
函数拼凑一些 export
语句,然后您可以从 shell.[=18 获取这些语句=]
bash中的示例:
$ source <(yq -r '
.services."my-service".environment
| to_entries[] | "export \(.key)=\(.value | @sh)"
' docker-compose.yaml)
$ echo $var1
test
$ echo $var2
1
$ echo $var3 # not fetched because it was commented out
在 POSIX sh 中,由于未定义进程替换,您可能会改用临时文件:
$ yq -r '
.services."my-service".environment
| to_entries[] | "export \(.key)=\(.value | @sh)"
' docker-compose.yaml > docker-compose.sh
$ cat docker-compose.sh
export var1='test'
export var2=1
$ . docker-compose.sh
$ echo $var1 $var2 $var3
test 1
此外,如果您的最终目标只是在给定环境中执行同样存储在 YAML 文件中的命令,而变量不会导出到外部 shell,则删除 export
,在脚本末尾添加.command
的内容,不要source而是执行脚本:
$ var1=old_value
$ yq -r '
.services."my-service"
| (.environment | to_entries[] | "\(.key)=\(.value | @sh)")
, .command
' docker-compose.yaml | sh
test 1
$ echo $var1
old_value