2017-06-04 110 views
2

任何人都可以解釋爲什麼這不起作用:回聲環境變量

# docker run -ti --rm golang echo $GOPATH 

# docker run -ti --rm golang echo \$GOPATH 
$GOPATH 

當這個作品:

# docker run -ti --rm golang bash -c "echo \$GOPATH" 
/go 

回答

2

1)docker run -ti --rm golang echo $GOPATH

docker run -ti golang echo $GOPATH 
/Users/me/go 

我刪除了--rm國旗能夠檢查容器。於是,我做了docker inspect container-id

"Env": [ 
    "no_proxy=*.local, 169.254/16", 
    "PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
    "GOLANG_VERSION=1.8.1", 
    "GOPATH=/go" 
], 
"Cmd": [ 
    "echo", 
    "/Users/me/go" 
], 

$GOPATH之前容器開始擴大。在調用docker命令之前,它已被您的外殼擴展,確實爲


2)docker run -ti --rm golang echo \$GOPATH

docker run -ti golang echo \$GOPATH 
$GOPATH 

docker inspect container-id

"Env": [ 
    "no_proxy=*.local, 169.254/16", 
    "PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
    "GOLANG_VERSION=1.8.1", 
    "GOPATH=/go" 
], 
"Cmd": [ 
    "echo", 
    "$GOPATH" 
], 

這裏$GOPATH是字符串,並沒有得到由外殼,因爲你躲過了擴大$,然後echo接收文字var名稱而不是其值。


3)docker run -ti --rm golang bash -c "echo \$GOPATH"

docker run -ti golang bash -c "echo \$GOPATH" 
/go 

docker inspect container-id

"Env": [ 
    "no_proxy=*.local, 169.254/16", 
    "PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
    "GOLANG_VERSION=1.8.1", 
    "GOPATH=/go" 
], 
"Cmd": [ 
    "bash", 
    "-c", 
    "echo $GOPATH" 
], 

在這裏,你的shell中運行,沒有變擴建碼頭工人也因\$,但有另一個可以捕獲並擴展它的shell:bash將會這樣做,但這次是在容器內部,其中GOPATH由docker提供,作爲golang圖像(GOPATH =/go)中定義的環境變量。請參閱Dockerfile定義的位置。

+0

它也將有助於在2''入口點'中解釋:null,'golang'圖像。如果我理解正確,它不是默認設置。 –