来自 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