2017-06-04 69 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'图像。如果我理解正确,它不是默认设置。 –