2015-05-30 17 views
16

Tôi chỉ cố gắng để nói với Ansible để xây dựng một hình ảnh Docker trên máy tính OS X của tôi và đây là lỗi tôi nhận được:vấn đề sử dụng Ansible để chạy nhiệm vụ Docker trên OS X

$ 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 

Đây là chính. yml tập tôi đang sử dụng:

--- 
- hosts: localhost 
    connection: local 

    tasks: 
     - name: Build docker image from dockerfiles 
      docker_image: 
      name: testimage 
      path: test 
      state: build 

My Dockerfile:

# Build an example Docker container image. 
FROM busybox 
MAINTAINER Jeff Geerling <[email protected]> 

# Run a command when the container starts. 
CMD ["/bin/true”]” 

tập tin Docker của tôi nằm ở cookbook/te st/Dockerfile

Và file main.yml tọa lạc tại cookbook/main.yml

Tôi đang chạy này trên OS X.

Tôi hoàn toàn bị mất vào thời điểm này và bất kỳ giúp đỡ sẽ rất được đánh giá cao.

chỉnh sửa:

Để đối phó với yêu cầu Nathanials mà tôi sử dụng -vvvv tôi nhận được lỗi sau:

(đây là nơi mà con đường được thiết lập để các thư mục con "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 

Để trả lời lỗi trên, tôi đã thử cung cấp đường dẫn đầy đủ đến thư mục xây dựng nơi Dockerfile được đặt

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

sau đó tôi nhận:

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 

chỉnh sửa # 2

OK, tôi đã cố gắng làm điều gì đó khác nhau. thay vì xây dựng một hình ảnh, tôi đã cố gắng để bắt đầu một hình ảnh. Sau khi diggin trong lib/python2.7/site-packages/ansible/modules/core/cloud/docker/docker.py Tôi nhận thấy rằng trong lớp DockerManager.init quanh dòng 558, chúng đặt một vài biến môi trường:

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

Vì vậy, tôi giải thích những giá trị đó thành một tệp nhật ký và không nhìn thấy, không có giá trị nào được đặt.

Sau đó, khi tôi đặt chúng trực tiếp trong 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 

tôi đã có thể thành công bắt đầu một container!

Tuy nhiên, phương pháp này không hoạt động với vấn đề ban đầu của tôi, đó là xây dựng hình ảnh trên đế.

Đào hơn nữa trong docker_image.py tôi nhận thấy rằng nó phá vỡ xuống xung quanh dòng 188 (tôi nói "xung quanh" bởi vì tôi đã đăng nhập phá vỡ vì vậy tôi không biết chính xác dòng), nơi nó có đoạn mã sau:

images = self.client.images() 

để tìm hiểu thêm và tôi thấy bản thân đó.khách hàng được kiểm tra ra các docker_url tại 'unix://var/run/docker.sock'

nhưng qua tại link này tôi thấy rằng /var/run/docker.sock không tồn tại trên OS X, thay vì một câu trả lời nói rằng

/var/run/docker.sock will not be on your OSX filesystem - the Docker daemon is running inside the boot2docker VM - and that's where the unix socket is.

That serial file is also not related to the docker socket.

oyu need to talk to the TCP socket specified in the DOCKER_HOST env.

bây giờ tôi cố gắng đặt docker_url thành URL DOCKER_HOST, làm mô tả cho mô-đun này cho biết:

docker_url: description: - URL of docker host to issue commands to required: false default: unix://var/run/docker.sock aliases: []

nhưng khi tôi đặt địa chỉ này thành địa chỉ DOCKER_HOST, tôi gặp lỗi.

Đây là 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 

và đây là lỗi:

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 

Bất kỳ ý tưởng?

+0

bạn đang sử dụng một cái gì đó giống như bot2docker để chạy các hình ảnh trong một vm? Docker sẽ không chạy trên MacOS. – errata

+1

chỉ cho tôi mẫu của 'Dockerfile', – BMW

+0

@ BMW- Tôi đã chỉnh sửa câu hỏi của mình ở trên để bạn có thể thấy Dockerfile – ron

Trả lời

0

Để giải quyết sự cố, bạn có thể sử dụng proxy, "hộp chứa socat" sẽ định tuyến yêu cầu của bạn từ địa chỉ tcp tới ổ cắm unix. Hãy xem page này. Cổng 2376 trên boot2docker chỉ hoạt động với ipv6 và không ipv4 (tôi không tìm thấy cách nào để thay đổi điều này, tôi đã không tìm hiểu sâu hơn về vấn đề này và không thích ý tưởng thay đổi máy ảo boot2docker). Tôi cũng đã thêm một NAT dịch trong VirtualBox cho localhost của tôi (ansible hàng tồn kho localhost)

Hãy cẩn thận với ansible và Docker-py

Bạn cần:

  • ansible 1.9.2
  • docker_api_version : 1.18

hoạt động cho tôi.

-2

Nếu bạn gặp phải lỗi này khi sử dụng docker cho mac (beta), bạn có thể đã quên cài đặt docker trên máy chủ từ xa của mình.

0

Nếu bạn muốn xây dựng hình ảnh docker với Ansible, tôi khuyên bạn hãy xem Ansible Container, là một dự án mã nguồn mở từ Ansible, đặc biệt tập trung vào xây dựng hình ảnh docker.

Vùng chứa an toàn cho phép bạn sử dụng vai trò Ansible hiện có/của riêng, để tạo hình ảnh docker.

0

cấu hình đầu tiên của bạn là gần như "ok", có hai điều cần thay đổi

tasks: ... 
    path: ./test 
    state: present 

thư mục gốc đến ansible trong trường hợp của bạn là nơi tập main.yml của bạn nằm.

cookbook/ 
├── main.yml 
└── test 
    └── Dockerfile 

Vì vậy, nội dung của chính.yml phí lưu trú này

--- 
- hosts: localhost 
    connection: local 

    tasks: 
    - name: Build docker image from dockerfiles 
    docker_image: 
     name: testimage 
     path: ./test 
     state: present 

Các bang cần phải được hiện phù doc

Các vấn đề liên quan