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)。