我想以與在容器中呼叫腳本相同的方式呼叫腳本。因此我必須設定幾個環境變數。有沒有辦法匯出 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
哪個會回傳:
var1: test
var2: 1
# var3: test # Some comment
uj5u.com熱心網友回復:
通過使用kislyuk/yq(而不是mikefarah/yq),它是 JSON 處理器stedolan/jq的 YAML 包裝器,您可以利用 jq 的@sh函式拼湊一些export您可以從 shell 獲取的陳述句。
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 檔案中,而變數不匯出到外殼中,然后洗掉,在腳本末尾export添加內容,.command并且不要來源而是執行腳本:
$ 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/444070.html
