Gurus,
I’m trying to create a docker image from a Dockerfile in an ec2 instance. I’m able to create the ec2 instances and copy over the dockerfile fine. However, for every ec2 instance I fire up, it always fails the first time I try to build the docker image.
- name: Build the docker Nginx image
docker_image:
path: “{{ docker_nginx_dir }}”
state: build
name: “grid/nginx”
The ansible failure stack trace looks like:
failed: [54.XX.XX.XX] => {“failed”: true, “parsed”: false}
invalid output was: SUDO-SUCCESS-bdbbnpaupjsbudcxajoycrwmbmlehwux
Traceback (most recent call last):
File “/home/ec2-user/.ansible/tmp/ansible-tmp-1414698075.43-175058707465136/docker_image”, line 1455, in
main()
File “/home/ec2-user/.ansible/tmp/ansible-tmp-1414698075.43-175058707465136/docker_image”, line 220, in mai n
image_id = manager.build()
File “/home/ec2-user/.ansible/tmp/ansible-tmp-1414698075.43-175058707465136/docker_image”, line 143, in bui ld
chunk_json = json.loads(chunk)
File “/usr/lib64/python2.6/json/init.py”, line 307, in loads
return _default_decoder.decode(s)
File “/usr/lib64/python2.6/json/decoder.py”, line 322, in decode
raise ValueError(errmsg(“Extra data”, s, end, len(s)))
ValueError: Extra data: line 1 column 87 - line 1 column 52865 (char 87 - 52865)
OpenSSH_6.2p2 Ubuntu-6ubuntu0.4, OpenSSL 1.0.1e 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: 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 = 24845
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 54.XX.XX.XX closed.
Looking at the docker log file on the ec2 instance, the only obvious error I always see is something like:
[f648bc68] -job log(start, aab655401a74e9e6bb098c1d62d31e44beb1c116eb530296f315392a82c2e3dc, 4d76087678ee) = OK (0)
[error] attach.go:186 attach: stdout: write unix @: broken pipe
[error] attach.go:258 attach: job 1 returned error write unix @: broken pipe, aborting all jobs
write unix @: broken pipe
[f648bc68] -job build() = ERR (1)
I subsequently bumped up the timeout value thinking that the ssh client was timing out:
- name: Build the docker Nginx image
docker_image:
timeout: 1200
path: “{{ docker_nginx_dir }}”
state: build
name: “grid/nginx”
But it fails much before this timeout. So I added a retry condition:
- name: Build the docker Nginx image
docker_image:
timeout: 1200
path: “{{ docker_nginx_dir }}”
state: build
name: “grid/nginx”
register: build_image_result
until: not build_image_result|failed
retries: 2
delay: 30
This seems to consistently work - and I see that it always gets called twice - but I’m concerned as to why it would always need to. Any ideas?
Thanks!
More info if anyone needs it:
EC2 setup
- name: Setup AWS EC2 Instances - US-West-1
ec2:
instance_type: t2.micro
image: “ami-41a7ea71”
monitoring: no
wait: yes
group: microserver_security_group
key_name: mykey
instance_tags:
Name: “MicroServer”
count: 1
region: “us-west-2”
register: ec2west2
Docker install tasks:
-
name: Update packages on the Amazon AMI
yum: name=* state=latest
when: ansible_distribution == ‘Amazon’ -
name: Install or Update Python on the Amazon AMI
yum: name=python state=latest
when: ansible_distribution == ‘Amazon’ -
name: Install or Update Python-pip on the Amazon AMI
yum: name=python-pip state=latest
when: ansible_distribution == ‘Amazon’ -
name: Install or Update Docker on the Amazon AMI
yum: name=docker state=latest
when: ansible_distribution == ‘Amazon’ -
name: Install or Update docker-py on all docker hosts
pip: name=docker-py version=0.3.1
Had to delete /tmp/pip-build-root because pip would keep installing docker-py 0.5.3 as it was cached in this directory
- name: Start the docker service on the Amazon AMI
service: name=docker state=restarted
Trying restarted because it always seems to fail the first time around
when: ansible_distribution == ‘Amazon’
Cheers.