为什么echo $ VARIABLE在dockerfile运行指令的/ bin/bash -c"..."部分中,在docker build上返回空?

Ame*_*Bel 2 bash shell docker

题 :

观察输出之间(见下文)--- echo home--- env,$GOPATH被明确定义为是$HOME.在addtion,输出echo $HOME是在之间的可见--- start--- echo home.但是,输出echo $GOPATH之间--- env--- echo gopath为空.为什么?

细节 :

Dockerfile RUN指令有问题

RUN /bin/bash -c "echo '-------------------------------------------- start' ;\
                  echo $HOME ;\
                  echo '-------------------------------------------- echo home' ;\
                  source $HOME/.gvm/scripts/gvm ;\
                  gvm use go1.5.1 ;\
                  env ;\
                  echo '-------------------------------------------- env ' ;\
                  echo $GOPATH ;\
                  echo '-------------------------------------------- echo gopath' ;\
                  "
Run Code Online (Sandbox Code Playgroud)

完成上述指令的docker构建步骤

Step 5 : RUN /bin/bash -c "echo '-------------------------------------------- start' ;                  echo $HOME ;                  echo '-------------------------------------------- echo home' ;                  source $HOME/.gvm/scripts/gvm ;                  gvm use go1.5.1 ;                  env ;                  echo '-------------------------------------------- env ' ;                  echo $GOPATH ;                  echo '-------------------------------------------- echo gopath' ;                  "
 ---> Running in c079d62aa7eb
-------------------------------------------- start
/home/amebel
-------------------------------------------- echo home
Now using version go1.5.1
HOSTNAME=e611e15f9c9d
GVM_ROOT=/home/amebel/.gvm
LD_LIBRARY_PATH=/home/amebel/.gvm/pkgsets/go1.5.1/global/overlay/lib:
PATH=/home/amebel/.gvm/pkgsets/go1.5.1/global/bin:/home/amebel/.gvm/gos/go1.5.1/bin:/home/amebel/.gvm/pkgsets/go1.5.1/global/overlay/bin:/home/amebel/.gvm/bin:/home/amebel/.gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
GVM_VERSION=1.0.22
PWD=/home/amebel
gvm_pkgset_name=global
SHLVL=1
HOME=/home/amebel
GOROOT=/home/amebel/.gvm/gos/go1.5.1
DYLD_LIBRARY_PATH=/home/amebel/.gvm/pkgsets/go1.5.1/global/overlay/lib:
gvm_go_name=go1.5.1
GVM_OVERLAY_PREFIX=/home/amebel/.gvm/pkgsets/go1.5.1/global/overlay
PKG_CONFIG_PATH=/home/amebel/.gvm/pkgsets/go1.5.1/global/overlay/lib/pkgconfig:
GOPATH=/home/amebel/.gvm/pkgsets/go1.5.1/global
GVM_PATH_BACKUP=/home/amebel/.gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
-------------------------------------------- env 

-------------------------------------------- echo gopath
 ---> db5582b888ab
Removing intermediate container c079d62aa7eb
Successfully built db5582b888ab
---- Finished build of amebel/golang ----
Run Code Online (Sandbox Code Playgroud)

提前致谢

Bar*_*mar 6

由于您的字符串是双引号,因此其中的变量将由运行命令的原始shell扩展,而不是由调用的shell扩展bash -c.GOPATH没有在原始shell中定义.

将参数bash -c放在单引号而不是双引号中,它将按字面顺序传递给bash.

RUN /bin/bash -c 'echo "-------------------------------------------- start" ;\
                  echo $HOME ;\
                  echo "-------------------------------------------- echo home" ;\
                  source $HOME/.gvm/scripts/gvm ;\
                  gvm use go1.5.1 ;\
                  env ;\
                  echo "-------------------------------------------- env " ;\
                  echo $GOPATH ;\
                  echo "-------------------------------------------- echo gopath" ;\
                  '
Run Code Online (Sandbox Code Playgroud)