Ansible Shell无法拉动Docker镜像

时间:2015-08-05 16:46:48

标签: shell docker ansible dockerhub dockerpy

我遇到了使用Ansible的Docker模块从私有DockerHub仓库中提取Docker镜像的问题,因此要进行完整性检查,确保代码首先尝试使用shell来提取相关图像。这也失败了。这里发生了什么?如果我在盒子上SSH,我可以在shell中运行完全相同的命令并且它可以工作,拉动正确的图像。

隔离示例游戏:

---
- hosts: <host-ip>
  gather_facts: True
  remote_user: ubuntu
  sudo: yes

  tasks:
  - include_vars: vars/client_vars.yml
  - name: Pull stardog docker image [private]
    shell: sudo docker pull {{stardog_docker_repo}}

  - name: Tag stardog docker image [private]
    shell: sudo docker tag {{stardog_docker_repo}} stardog_tag

输出的错误是:

failed: [<host-ip>] => {"changed": true, "cmd": "sudo docker pull <org>/<image>:latest", "delta": "0:00:01.395931", "end": "2015-08-05 17:35:22.480811", "rc": 1, "start": "2015-08-05 17:35:21.084880", "warnings": []}
stderr: Error: image <org>/<image>:latest not found
stdout: Pulling repository <org>/<image>

FATAL: all hosts have already failed -- aborting

注意:我已对我的<org><image>进行了清理,但请放心,他们在剧本中的图像标识符和错误记录完全匹配我可以通过ssh在shell中成功运行的图像这样做的:

$ sudo docker pull <org>/<image>:latest

我意识到各种GitHub问题(使用Docker模块时遇到like this one),补丁等与docker-py库有关,但这里的问题是我&#39;我只是使用Ansible shell模块。我错过了什么?

2 个答案:

答案 0 :(得分:2)

我的一位同事指出了一些事情 - 如果你记录env,你会发现sudo: yes使root默认运行docker命令,因此ubuntu用户的Docker凭据未被提取。此剧本有效(假设您在dockercfg.json文件夹中有相对于此剧本的有效docker

---
- hosts: <host-ip>
  gather_facts: True
  remote_user: ubuntu
  sudo: yes

  tasks:
  - include_vars: vars/client_vars.yml
  # run the docker tasks

  - name: Add docker credentials for ubuntu user
    copy: src=docker/dockercfg.json dest=/root/.dockercfg

  - name: Get env
    shell: sudo env
    register: sudo_env

  - name: Debug
    debug: msg="{{sudo_env}}"

  - name: Pull stardog docker image [private]
    shell: docker pull {{stardog_docker_repo}}

  - name: Tag stardog docker image [private]
    shell: docker tag {{stardog_docker_repo}} stardog_tag

这为root提供了正确的DockerHub信誉。或者,您可以为每个游戏添加sudo: false,并在每个shell调用中使用内联sudo,以ubuntu用户身份运行。

答案 1 :(得分:0)

你应该使用Ansible的docker_container  模块现在拉图像。

通过这种方式,您不需要在shell中运行sudo。

http://docs.ansible.com/ansible/docker_container_module.html