使用Ansible在OS X上运行docker任务的问题

我只是想告诉Ansible在我的OS X机器上build立一个docker镜像,这是我得到的错误:

$ ansible-playbook main.yml PLAY [localhost] ************************************************************** GATHERING FACTS *************************************************************** ok: [localhost] TASK: [Build docker image from dockerfiles] *********************************** failed: [localhost] => {"changed": false, "failed": true} msg: ConnectionError(ProtocolError('Connection aborted.', error(2, 'No such file or directory')),) FATAL: all hosts have already failed -- aborting PLAY RECAP ******************************************************************** to retry, use: --limit @/Users/ronny/main.retry localhost : ok=1 changed=0 unreachable=0 failed=1 

这是我使用的main.yml文件:

 --- - hosts: localhost connection: local tasks: - name: Build docker image from dockerfiles docker_image: name: testimage path: test state: build 

我的Dockerfile:

 # Build an example Docker container image. FROM busybox MAINTAINER Jeff Geerling <geerlingguy@mac.com> # Run a command when the container starts. CMD ["/bin/true”]” 

我的docker文件位于cookbook / test / Dockerfile

main.yml文件位于cookbook / main.yml中

我在OS X上运行这个。

我完全失去了这一点,任何帮助将非常感激。

编辑:

为了响应Nathanials请求我使用-vvvv我得到以下错误:

(这是path被设置为子目录“test”的地方)

 TASK: [Build docker image from dockerfiles] *********************************** <localhost> ESTABLISH CONNECTION FOR USER: ronny <localhost> REMOTE_MODULE docker_image name=test state=build path=test <localhost> EXEC ssh -C -tt -vvv -o ControlMaster=auto -o ControlPersist=60s -o ControlPath="/Users/ronny/.ansible/cp/ansible-ssh-%h-%p-%r" -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 localhost /bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724 && echo $HOME/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724' <localhost> PUT /var/folders/s1/g6kswg952gvg5df6wld173480000gn/T/tmp3g0PIz TO /Users/ronny/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724/docker_image <localhost> EXEC ssh -C -tt -vvv -o ControlMaster=auto -o ControlPersist=60s -o ControlPath="/Users/ronny/.ansible/cp/ansible-ssh-%h-%p-%r" -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 localhost /bin/sh -c 'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /Users/ronny/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724/docker_image; rm -rf /Users/ronny/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724/ >/dev/null 2>&1' failed: [localhost] => {"failed": true, "parsed": false} Traceback (most recent call last): File "/Users/ronny/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724/docker_image", line 1852, in <module> main() File "/Users/ronny/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724/docker_image", line 235, in main image_id = manager.build() File "/Users/ronny/.ansible/tmp/ansible-tmp-1433079033.35-4833710313724/docker_image", line 140, in build stream = self.client.build(self.path, tag=':'.join([self.name, self.tag]), nocache=self.nocache, rm=True, stream=True) File "/usr/local/lib/python2.7/site-packages/docker/client.py", line 319, in build raise TypeError("You must specify a directory to build in path") TypeError: You must specify a directory to build in path OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011 debug1: Reading configuration data /etc/ssh_config debug1: /etc/ssh_config line 20: Applying options for * debug1: auto-mux: Trying existing master debug2: fd 3 setting O_NONBLOCK debug2: mux_client_hello_exchange: master version 4 debug3: mux_client_forwards: request forwardings: 0 local, 0 remote debug3: mux_client_request_session: entering debug3: mux_client_request_alive: entering debug3: mux_client_request_alive: done pid = 78798 debug3: mux_client_request_session: session request sent debug1: mux_client_request_session: master session id: 2 debug3: mux_client_read_packet: read header failed: Broken pipe debug2: Received exit status from master 0 Shared connection to localhost closed. FATAL: all hosts have already failed -- aborting PLAY RECAP ******************************************************************** to retry, use: --limit @/Users/ronny/main.retry localhost : ok=1 changed=0 unreachable=0 failed=1 

为了响应上述错误 ,我尝试了Dockerfile所在的build目录的完整path

 path: "/Users/ronny/projects/dockers/tutorial/ansibledocker/test” 

然后我得到:

 TASK: [Build docker image from dockerfiles] *********************************** <localhost> ESTABLISH CONNECTION FOR USER: ronny <localhost> REMOTE_MODULE docker_image name=test state=build path=/Users/ronny/projects/dockers/tutorial/ansibledocker/test <localhost> EXEC ssh -C -tt -vvv -o ControlMaster=auto -o ControlPersist=60s -o ControlPath="/Users/ronny/.ansible/cp/ansible-ssh-%h-%p-%r" -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 localhost /bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1433079137.87-213359153110012 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1433079137.87-213359153110012 && echo $HOME/.ansible/tmp/ansible-tmp-1433079137.87-213359153110012' <localhost> PUT /var/folders/s1/g6kswg952gvg5df6wld173480000gn/T/tmplH4Lln TO /Users/ronny/.ansible/tmp/ansible-tmp-1433079137.87-213359153110012/docker_image <localhost> EXEC ssh -C -tt -vvv -o ControlMaster=auto -o ControlPersist=60s -o ControlPath="/Users/ronny/.ansible/cp/ansible-ssh-%h-%p-%r" -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 localhost /bin/sh -c 'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /Users/ronny/.ansible/tmp/ansible-tmp-1433079137.87-213359153110012/docker_image; rm -rf /Users/ronny/.ansible/tmp/ansible-tmp-1433079137.87-213359153110012/ >/dev/null 2>&1' failed: [localhost] => {"changed": false, "failed": true} msg: ConnectionError(ProtocolError('Connection aborted.', error(2, 'No such file or directory')),) FATAL: all hosts have already failed -- aborting PLAY RECAP ******************************************************************** to retry, use: --limit @/Users/ronny/main.retry localhost : ok=1 changed=0 unreachable=0 failed=1 

编辑#2

好吧,我试着做一些不同的事情。 我试图简单地启动一个图像,而不是build立一个图像。 在lib / python2.7 / site-packages / ansible / modules / core / cloud / docker / docker.py中,我注意到,在第558行的DockerManager.init类中,他们设置了几个环境variables:

 env_host = os.getenv('DOCKER_HOST') env_docker_verify = os.getenv('DOCKER_TLS_VERIFY') env_cert_path = os.getenv('DOCKER_CERT_PATH') env_docker_hostname = os.getenv('DOCKER_TLS_HOSTNAME') 

所以我把这些数值扔进一个日志文件中,看哪,它们都没有被设置。

然后当我直接在main.yml中设置它们时:

 - name: start container docker: name: mydata image: busybox state: present environment: DOCKER_HOST: tcp://192.168.59.103:2376 DOCKER_TLS_VERIFY: 1 DOCKER_CERT_PATH: /Users/ronny/.boot2docker/certs/boot2docker-vm DOCKER_TLS_HOSTNAME: boot2docker 

我能够成功启动一个容器!

然而,这个方法并没有与我最初的问题,这是build立一个docker形象。

在docker_image.py中进一步挖掘我注意到,它围绕188行(我说“周围”,因为我有logging中断,所以我不知道确切的行),它有以下代码:

  images = self.client.images() 

所以更多的挖掘,我看到self.client检查docker_url在'unix://var/run/docker.sock'

但通过这个链接,我发现OS X上不存在/var/run/docker.sock,而是一个回复说:

/var/run/docker.sock不会在OSX文件系统上 – Docker守护进程在boot2docker虚拟机内运行 – 这就是unix套接字所在的位置。

该串行文件也与docker套接字无关。

oyu需要与在DOCKER_HOST env中指定的TCP套接字通信。

现在我试着将docker_url设置为DOCKER_HOST的URL,因为这个模块的描述如下:

docker_url:description: – 将命令发布为必需的docker主机的URL:false默认值:unix://var/run/docker.sock别名:[]

但是当我把它设置到DOCKER_HOST地址,我得到一个错误。

这里是main.yml

  - name: Build docker image from dockerfiles docker_image: name: testimage # path: test path: /Users/ronny/projects/dockers/tutorial/ansibledocker/test state: build docker_url: 192.168.59.103:2376 

这里是错误的:

 failed: [localhost] => {"changed": false, "failed": true} msg: ConnectionError(ProtocolError('Connection aborted.', BadStatusLine('\x15\x03\x01\x00\x02\x02\n',)),) FATAL: all hosts have already failed -- aborting PLAY RECAP ******************************************************************** to retry, use: --limit @/Users/ronny/main.retry localhost : ok=3 changed=0 unreachable=0 failed=1 

有任何想法吗?

作为一种解决方法,您可以使用代理“socat-container”,它将您的请求从tcp地址路由到unix套接字。 看看这个页面 。 boot2docker上的端口2376只适用于ipv6,而不适用于ipv4(我发现没有办法改变这种情况,我没有深入研究这个问题,也不喜欢改变boot2docker虚拟机的想法)。 我还在我的本地主机(安全库存本地主机)VirtualBox中添加了一个NAT转换,

小心使用可靠的docker-py

你需要:

  • 1.9.2
  • docker_api_version:1.18

为我工作。

如果你想用Ansible构builddocker镜像,我build议你看一下Ansible Container ,它是Ansible的一个开源项目,专注于构buildDocker镜像。

Ansible容器使您能够使用现有/自己的Ansibleangular色来构build泊坞窗图像。

如果在使用docker for mac(beta)时出现此错误,则可能忘记在您的远程服务器上安装docker。