2017-06-04 5 views

答えて

2

1)docker run -ti --rm golang echo $GOPATH

docker run -ti golang echo $GOPATH 
/Users/me/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": [ 
    "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" 
], 

、あなたのシェルが原因\$に、あまりにもいない変数の展開とのドッキングウィンドウを実行しますが、そこにありますそれをキャッチして展開する別のシェル:bashはこれを行いますが、今度はgolangイメージ(GOPATH =/go)で定義された環境変数としてGOPATHがdockerによって提供されています。それが定義されているDockerfileを参照してください。

+0

また、 '' Entrypoint ':null、 '' golang'画像について説明するのに役立ちます。私が正しく理解していれば、デフォルト設定ではありません。 –