2017-08-28 84 views
1

我的基本圖像爲go。此圖像具有默認變量$GOPATH=/go 現在我想從這個圖像是這樣開始的容器:在docker中設置基於環境變量的env文件中的環境變量

$ docker run -env-file ./myenvfile go 

myenvfile的內容是

TEST=$GOPATH/other/path 

當我開始我的容器中,我做了一個echo $TEST輸出是$GOPATH/other/path而我希望/go/other/path

是否可以在您的docker的env-file中重用現有的環境變量?

回答

0

AFAIK這是不可能的,因爲Docker不會對這些變量應用替換。但是,您可以在容器中手動執行此操作。 YMMV,我用命令行參數進行了測試。

$ docker run -it --rm -e TEST1="my-path" -e TEST2='$TEST1/test' ubuntu bash 
[email protected]:/# echo "$TEST1" 
my-path 
[email protected]:/# echo "$TEST2" 
$TEST1/test 

$TEST1是在輸出,因爲Bash解釋你在命令行寫的是什麼,但沒有什麼是變量。因此,添加eval解決$TEST

[email protected]:/# eval echo "$TEST2" 
my-path/test 

echo"$TEST2"eval這裏的論點。但是在執行eval之前,$TEST2被0123ash替換爲bash。因此,echo$TEST1/test被給予eval,其解釋爲$TEST1並且用my-path代替它。

但是,使用eval會帶來一些安全風險,但它可以直接使用。有一種替代,envsubst,以便您必須首先安裝:

[email protected]:/# apt update && apt install -y gettext-base 
[...] 
[email protected]:/# echo "$TEST2" | envsubst 
my-path/test 

由於envsubst不能被劫持執行任意命令其更安全。

您可以使用ENTRYPOINT腳本中的先前技術以透明的方式展開環境變量,例如, (未測試)

#!/bin/bash 

export TEST2=`echo $TEST2 | envsubst` 

exec "[email protected]"