在.bashrc中导出DOCKER_HOST对terminal中的相同命令产生不同的结果

在我可以使用我的docker容器(在OSX上使用Boot2Docker)之前,我总是要记得进入

 export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2375 

在我的terminal,自然我经常忘记这一点。

所以我想我只是将该行添加到我的~/.bashrc文件,但是当我这样做,并检查DOCKER_HOST的值是tcp://192.168.42.43:4243而不是tcp://192.168.42.43:2375

打破它:

  • boot2docker ip =>“虚拟机的主机接口IP地址是:192.168.59.103”
  • boot2docker ip 2 =>“虚拟机的主机接口IP地址是:192.168.59.103”
  • boot2docker ip 2>/dev/null =>“192.168.59.103”(好吧,我得到的,但我不知道如何工作,我不知道:4243是从哪里来的。

这里究竟发生了什么,港口为什么不同呢?

还有一件事是为你设置这个环境variables。 你为什么把stderr从该命令转储到/dev/null 。 是否有一些额外的信息来stderr

我会做

 export DOCKER_HOST="tcp://$(boot2docker ip 2>/dev/null):2375" ; echo "Docker Host is set to ${DOCKER_HOST}" 

对于一些debugging,因为它被设置,然后在稍后查询值,看看是否有其他东西搞乱了它。

如果您希望为您打开的每个terminal自动设置DOCKER_HOST环境variables,请使用“boot2docker shellinit”命令。 您可以将此行添加到您的.bash_profile中以照顾业务:

 $(boot2docker shellinit) 

不幸的是,如果你打开terminal的时候你的boot2docker虚拟机没有运行(“运行中的错误:虚拟机”boot2docker-vm“没有运行”),这会给你一个烦人的错误信息。把它放在你的.bash_profile中,错误信息:

 $(boot2docker shellinit 2>/dev/null) 

在Github的更多细节

注意:如果您使用Docker Machine来pipe理boot2docker,则等效命令是

 eval "$(docker-machine env MACHINE-NAME)" 

MACHINE-NAME是你的boot2docker机器的名字。

我认为boot2docker的socket命令在这里比较有用,我们也可以简化一下。

如果你之前没有在terminal上运行这个设置,

  echo export DOCKER_HOST=\`boot2docker socket 2\>/dev/null\` >> ~/.bashrc 

如果你已经搞乱了这个,把你的.bashrc中的行改为:

  export DOCKER_HOST=`boot2docker socket 2>/dev/null` 

现在testing它已经开放了一个新的terminal,并运行docker run hello-world