如何在Ansible中运行ad hoc Docker Compose命令?

5

我需要运行多个docker-compose run命令来运行我的Phoenix Web应用程序项目。我需要在终端里运行以下命令:

$ sudo docker-compose run web mix do deps.get, compile

$ sudo docker-compose run web mix ecto.create

$ sudo docker-compose run web mix ecto.migrate

虽然这样做很好,但是我想使用Ansible自动化它。我知道有一个docker_service Ansible模块,它使用docker-compose API,并且我也知道definition选项可以将配置轻松地集成到我的playbook中。 我不知道的是如何确保在启动容器之前运行上述命令。有人能帮我解决这个问题吗?

1个回答

2
我面临了与你类似的情况,即找不到通过Ansible的docker专用模块运行docker-compose run命令的方法。但是,我最终成功地使用了Ansible的shell模块来实现我的目的。在这里,我们有一些适合你情况的示例。

逐个执行,显式方式

- name: Run mix deps.get and compile
  shell: docker-compose run web mix do deps.get, compile
  args:
    chdir: /path/to/directory/having/your/docker-compose.yml
  become: True # because you're using sudo

- name: Run mix ecto.create
  shell: docker-compose run web mix ecto.create
  args:
    chdir: /path/to/directory/having/your/docker-compose.yml
  become: True

- name: Run mix ecto.migrate
  shell: docker-compose run web mix ecto.migrate
  args:
    chdir: /path/to/directory/having/your/docker-compose.yml
  become: True

相等的方式,但更短。
- name: Run mix commands
  shell: docker-compose run web mix "{{ item }}"
  args:
    chdir: /path/to/directory/having/your/docker-compose.yml
  loop:
    - "do deps.get, compile"
    - "ecto.create"
    - "ecto.migrate"
  become: True

在启动 docker-compose.yml 文件中定义的其他容器之前运行这些命令,可能以下几点的组合有所帮助:
  • 使用 Docker 卷来持久化获取依赖、编译和 Ecto 命令的结果
  • docker-compose.yml 文件中使用 depends_on 配置选项
  • 在你的 Playbook 中使用 Ansible 的 docker_service 模块service 参数,只运行子集容器
  • 通过 --rm 选项和可能的 --no-deps 选项,使用可丢弃的容器来运行你的 docker-compose run 命令
  • 在你的 Playbook 中,在执行 docker_service 任务之前执行 docker-compose run 命令
一些注意事项:
  • 我在回答时正在使用 Ansible 2.5。
  • 我假设 docker-compose 二进制文件已经安装,正常工作,并且在受控主机上的标准系统 PATH 上可用。
  • docker-compose.yml 文件已经存在,路径为 /path/to/directory/having/your/docker-compose.yml,就像示例中使用的那样。也可以使用该文件路径的变量。

就这些!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接