docker运行的回声环境变量



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

# 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。

最新更新