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 命令之前由您的shell确实扩展。
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 是一个文字字符串,不会被shell 扩展,因为您转义了$,然后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 也运行没有变量扩展的 docker,但是还有另一个 shell 会捕获并扩展它:bash 会这样做,但这次是在容器内,其中GOPATH 由 docker 提供,作为在 golang 映像中定义的环境变量 (GOPATH=/go)。请参阅定义的Dockerfile。