使用Ansible在Docker容器内部运行命令

时间:2015-10-01 03:03:47

标签: docker ansible ansible-playbook

我想要完成的是在Docker容器中运行已经使用Ansible在Digital Ocean Ubuntu / Docker Droplet上创建的命令。

似乎无法在此找到任何内容,或者我主要缺少某些内容。这是我的剧本中的Ansible任务。我对Ansible很新,所以任何建议或智慧都会受到高度赞赏。

str = cell(1,4); %initialize a cell array to hold the legend strings

for
    .
    .
    .
    str{cnt}=sprintf('%f volts',V(cnt)); %insert text into the appropriate cells
end
legend(str)

6 个答案:

答案 0 :(得分:33)

在与ansible github project上的一些非常有帮助的开发人员讨论之后,更好的方法就是这样:

- name: add container to inventory
  add_host:
    name: [container-name]
    ansible_connection: docker
  changed_when: false

- name: run command in container
  delegate_to: [container-name]
  raw: bash

如果你的图像中安装了python,你可以使用命令模块或任何其他模块而不是raw。

如果要在远程泊坞主机上执行此操作,请添加:

ansible_docker_extra_args: "-H=tcp://[docker-host]:[api port]"

到add_host块。

有关更完整的示例,请参阅Ansible documentation

答案 1 :(得分:17)

您应该能够使用docker exec执行脚本(包含您的命令序列):

<div id="addcontainer">
  <div id="addprimary">
    <ul>
      <li>
        <a href="#home">
          <img src="https://www.seoclerk.com/pics/183798-18HhJR1392119968.jpg">>
        </a>
      </li>
    </ul>
  </div>
  <div id="addcontent">
  </div>

  <div id="addsecondary">
    <ul>
      <li>
        <a href="#home">
          <img src="https://www.seoclerk.com/pics/183798-18HhJR1392119968.jpg">
        </a>
      </li>
    </ul>
  </div>
</div>

(另见“Why do I have to use bash -l -c inside my container?”)

    您的Ansible流程应该可以访问
  • docker exec container-name bash -l -c /path/to/script > /path/to/log
  • /path/to/script是容器内的路径,可以在卷中共享。

答案 2 :(得分:6)

您可以使用command module在docker容器中运行命令。例如,此代码将在 my_container 中执行echo "Hello1"echo "Hello2"

   tasks:
        - name: Execute commands in docker container
          command: docker exec -it my_container bash -c 'echo "Hello1"; echo "Hello2"'

答案 3 :(得分:1)

更新:有一种方法可以在不使用我的模块的情况下执行此操作,请参阅我的其他答案

我编写了一个简单的模块来在远程Docker主机上运行exec。我submitted it to the ansible project,但如果需要,您可以轻松地将其添加到您自己的项目中。该模块只有23行,从我的拉取请求中取出并将其添加到您的./library目录中,然后您可以在您的剧本中添加任务,如下所示:

  - name: Run docker exec command
    docker_exec: 
      command: <some command>
      docker_host: <docker host>
      name: <container name>
    register: exec_output

  - name: Show exec output
    debug: msg="{{ exec_output.result }}"

答案 4 :(得分:1)

Ansible 2.10 起,docker_container_execcommunity.docker 集合的一部分:

- name: Run a simple command (command)
  community.docker.docker_container_exec:
    container: foo
    command: /bin/bash -c "ls -lah"
    chdir: /root
  register: result

- name: Print stdout
  debug:
    var: result.stdout

答案 5 :(得分:-1)

最终做了这样的事情:

- name: execute command in docker
  shell: |
    docker exec container sh -l -c "cat /tmp/secret"
  register: hello

- debug: msg="{{ hello.stdout }}"