使用docker运行echo环境variables

任何人都可以解释为什么这不起作用:

# 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被展开。 在shell命令被调用之前,它已经被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是一个文字string,不会被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时也没有variables扩展,但是有另外一个shell会捕获并扩展它: bash会这样做,但是这次在容器内部,docker提供了GOPATH作为在golang映像中定义的环境variables(GOPATH = / go)。 请参阅定义的Dockerfile 。