10

Can anybody explain why this doesn't work:

# docker run -ti --rm golang echo $GOPATH

# docker run -ti --rm golang echo \$GOPATH
$GOPATH

when this works:

# docker run -ti --rm golang bash -c "echo \$GOPATH"
/go

1 Answer 1

9

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

docker run -ti golang echo $GOPATH
/Users/me/go

I removed the --rm flag to be able to inspect the container. Then, I did 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 is expanded before the container starts. It's expanded by your shell, indeed before the docker command is called.


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"
],

Here the $GOPATH is a literal string and doesn't get expanded by the shell because you escaped the $, then echo receives the literal var name instead of its value.


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"
],

Here, your shell runs docker with no variable expansion too, due to the \$, but there is another shell that will catch it and expand it: bash will do that but inside the container this time, where the GOPATH is provided by docker as environment variable defined in the golang image (GOPATH=/go). See the Dockerfile where that is defined.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.