任何人都可以解释为什么这不起作用:
# 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
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"
],
在这里,由于$
,您的外壳也没有可变扩展的docker,但是还有另一个外壳会捕获并扩展它: bash
会做到这一点Docker作为golang
图像中定义的环境变量(Gopath =/go(。请参阅定义的Dockerfile。