eval“$(docker-machine env default)”

我有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成功完成。

我的问题为什么这个工作,实际发生了什么,我该如何解决?

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

我不是超级stream利的bash,但我总是被告知不要运行eval ,特别是不要运行eval与“

当你运行docker命令时,CLI连接到Docker守护进程的API,这是实际完成工作的API。 您可以通过更改API连接详细信息来pipe理远程Docker主机,这些Docker存储在CLI运行的客户端的环境variables中。

使用Docker Machine时,您的Docker引擎将运行在虚拟机中,该虚拟机实际上是一个远程计算机,因此您需要将本地CLIconfiguration为连接到该虚拟机。 Docker Machine知道它所pipe理的引擎的连接细节,因此运行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命令中的每一个,而不是仅仅将它们写入控制台,所以这是设置环境variables的快捷方式。

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

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

Docker文档在其描述中包含了使用Docker机器的步骤: https : //docs.docker.com/machine/get-started/

这一步做什么(我build议你也自己尝试):

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

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

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