使用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。
- Vagrant,Ansible和Docker如何让Linux dev机器尽可能接近生产
- 使用Ansible和Docker部署/运行Redis服务
- Ansible主机的行为:设置Vagrant或Docker
- docker工人build立官方jenkins容器内
- Ansible Container无法加载libsudo_util.so.0以执行特权模块
- docker工人,如何取代docker工人的卡皮斯特拉诺任务
- 如何将string拆分为数组和循环呢?
- 用可变键Ansible docker_container etc_hosts
- 如何使用Ansible Playbook将nginx docker容器安装到主机中?