我遇到了使用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
模块。我错过了什么?
答案 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