如何在Ansible中运行ad hoc docker compose命令?

时间:2017-03-06 12:58:56

标签: docker-compose phoenix-framework ansible-2.x

我必须为Phoenix Web应用程序项目运行几个docker-compose run命令。从终端我必须运行:

$ 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选项可以很容易地隐藏在docker中集成配置-compose.yml进入我的剧本。 我不知道的是如何确保在启动容器之前运行上述命令。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我遇到了类似你的情况,没有办法通过 docker 专用模块为Ansible运行 docker-compose run 命令。但是,为了我的目的,我最终使用Ansible's shell module成功了。这里有一些适合您情况的例子。

一个接一个,明确的方式

- 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 volume来保存获取依赖项,编译和 Ecto 命令的结果
  • 使用depends_on文件
  • 中的docker-compose.yml配置选项
  • 使用游戏手册中service的{​​{1}}参数仅运行容器子集
  • 使用docker-compose run命令通过--rm选项使用一次性容器,并可能使用--no-deps选项
  • 在您的剧本中,在docker-compose run任务
  • 之前执行docker_service命令

一些注意事项:

  • 我在撰写此答案时正在使用Ansible 2.5。
  • 我假设已经安装了 docker-compose 二进制文件,它工作正常,并且可以在托管主机上的标准系统PATH上使用。
  • docker-compose.yml文件已存在且路径为 /path/to/directory/having/your/docker-compose.yml ,如示例所示。也可以使用该文件路径的变量。

就是这样!