eval" $(docker-machine env default)"

时间:2016-10-14 08:32:30

标签: bash docker docker-compose docker-machine

我在使用docker-compose启动docker时遇到了问题。

当我运行docker-compose -f dev.yml build我跟随错误>

Building postgres
ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.

但是,如果我运行docker-machine ls机器显然是>

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.1

我通过运行eval "$(docker-machine env default)"来修复错误,之后docker-compose -f dev.yml build成功完成。

我的问题为什么这样做,实际发生了什么以及如何撤消它?

这也是一种安全的解决方法吗?现在这只是我的笔记本电脑,但这些容器应该在不久的将来打到公司的服务器。

我对bash并不是非常流利,但我总是被告知不要运行eval,特别是不要使用"

2 个答案:

答案 0 :(得分:26)

当您运行docker命令时,CLI将连接到Docker守护程序的API,它是实际完成工作的API。您可以通过更改API连接详细信息来管理本地CLI中的远程Docker主机,Docker存储在运行CLI的客户端上的环境变量中。

使用Docker Machine,您的Docker引擎在VM中运行,VM实际上是远程计算机,因此需要将本地CLI配置为连接到它。 Docker Machine知道它管理的引擎的连接详细信息,因此运行docker-machine env default会打印出default计算机的详细信息。输出是这样的:

 $ docker-machine env default
 export DOCKER_TLS_VERIFY="1"
 export DOCKER_HOST="tcp://172.16.62.130:2376"
 export DOCKER_CERT_PATH="/Users/elton/.docker/machine/machines/default"
 export DOCKER_MACHINE_NAME="default"

使用eval执行每个export命令,而不是将它们写入控制台,这样就可以快速设置环境变量。

您可以撤消它并使用docker-machine env --unset重置本地环境,这将为您提供取消设置环境的输出(因此CLI将尝试连接到本地Docker引擎)。

答案 1 :(得分:3)

这确实是在本机上不支持Docker的计算机上使用Docker的预期方法,例如在Windows或Mac OS X上。

Docker文档在其描述中包含了使用Docker Machine的步骤:this thread provides a workaround

这一步做了什么(我建议你自己尝试一下):

  • 运行docker-machine env default
  • 获取该命令的输出并在当前的shell会话中执行它。

如果你自己运行docker-machine env default,你会发现它只是建议设置一些环境变量,这些变量允许Docker命令找到运行Docker守护进程的VM。如果没有设置这些变量,Docker根本不知道如何与Docker守护进程通信。

在服务器环境(Linux)中,您不需要Docker Machine,因为Linux内核本身支持运行容器。您只需要在本机上不支持运行容器的操作系统上使用Docker Machine(运行Linux内核的小型VM)。