Ansible Shell无法提取Docker映像

Ansible Shell无法提取Docker映像,shell,docker,ansible,dockerhub,dockerpy,Shell,Docker,Ansible,Dockerhub,Dockerpy,我在使用Ansible的Docker模块从私有DockerHub回购中提取Docker图像时遇到问题,因此为了检查代码是否正常,决定先使用shell尝试提取有问题的图像。这也失败了。这是怎么回事?如果我SSH到这个盒子上,我就能够在shell中运行完全相同的命令,并且它可以工作,拉取正确的映像 单独的示例播放: --- - hosts: <host-ip> gather_facts: True remote_user: ubuntu sudo: yes tasks:

我在使用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
---
-主持人:
收集事实:真实
远程用户:ubuntu
苏多:是的
任务:
-包括变量:变量/客户变量.yml
-名称:Pull stardog docker图像[私人]
shell:sudo docker pull{{stardog_docker_repo}
-名称:标记stardog docker图像[专用]
shell:sudo docker标签{{stardog\u docker\u repo}}stardog\u标签
正在输出的错误是:

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
失败:[]=>{“更改”:true,“cmd”:“sudo docker pull/:latest”,“delta”:“0:00:01.395931”,“end”:“2015-08-05 17:35:22.480811”,“rc”:1,“start”:“2015-08-05 17:35:21.084880”,“警告”:[]}
stderr:错误:image/:未找到最新版本
标准输出:拉存储库/
致命:所有主机都已失败--正在中止
注意:我已经清理了我的
,但请放心,它们在剧本中的图像标识符和错误日志与我可以通过ssh在shell中成功运行的图像完全匹配,方法是:

$ sudo docker pull <org>/<image>:latest
$sudo docker pull/:最新版本

我知道各种GitHub问题(我在使用Docker模块时遇到过)、与
Docker py
库相关的补丁等等,但这里的问题是我只是在使用Ansible
shell
模块。我遗漏了什么?

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

---
- 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
---
-主持人:
收集事实:真实
远程用户:ubuntu
苏多:是的
任务:
-包括变量:变量/客户变量.yml
#运行docker任务
-名称:为ubuntu用户添加docker凭据
复制:src=docker/dockercfg.json dest=/root/.dockercfg
-名称:Get env
外壳:sudo env
注册号码:sudo_env
-名称:调试
调试:msg=“{sudo_env}}”
-名称:Pull stardog docker图像[私人]
外壳:docker pull{{stardog_docker_repo}
-名称:标记stardog docker图像[专用]
shell:docker标签{{stardog\u docker\u repo}}stardog\u标签

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

您应该使用Ansible的docker\u容器 模块现在拉图像

这样,您就不需要在shell中运行sudo


文件对我来说是
~/.docker/config.json
,但这个想法正是我解决问题所需要的,谢谢!