如何使用Ansible运行'docker volume create'命令?

7
我有一个Rails应用程序,我通过Ansible在Docker容器中部署它。到目前为止,我的应用程序包括三个容器:
- 一个Docker卷容器(使用docker volume create --name dbdata创建) - 一个Postgres容器(带有volumes_from dbdata) - Rails应用程序容器(与Postgres容器链接)
我的部署playbook已经可以工作了,但是我不得不通过SSH在服务器上运行docker volume create命令。我想通过Ansible来实现这一点,这样我就可以在空容器上部署一个新的应用程序实例。
是否有办法通过Ansible运行docker volume create,或者还有其他方法可以做到这一点?我检查了Ansible Docker模块的文档,但似乎他们还不支持volume create。除非我漏掉了什么?

Ansible可以使用“command”或“shell”模块运行任意命令,因此您可以在命令行上运行的任何内容也可以通过ansible运行。 - larsks
是的,我考虑过这个问题,但不知道如何像Docker模块对容器那样使用state=present。尽管如果你用相同的名称两次运行docker volume create,第二次将不会有任何效果,因为卷已经存在了。嗯! - David Ham
3个回答

11

以下是一种选项,使用command模块。

- hosts: localhost
  tasks:
    - name: check if myvolume exists
      command: docker volume inspect myvolume
      register: myvolume_exists
      failed_when: false

    - name: create myvolume
      command: docker volume create --name myvolume
      when: myvolume_exists|failed

我们首先使用docker volume inspect检查卷是否存在。我们将该任务的结果保存在变量myvolume_exists中,然后仅当inspect任务失败时,我们才会创建该卷。


5
您可以使用Ansible自带的docker_volume模块来管理Docker卷。该模块在2.4版本中新增。
示例:
- name: Create a volume
  docker_volume:
    name: volume_one

- name: Remove a volume
  docker_volume:
    name: volume_one
    state: absent

- name: Create a volume with options
  docker_volume:
    name: volume_two
    driver_options:
      type: btrfs
      device: /dev/sda2

4

现在您可以使用-v参数创建命名卷,来自docker run的手册:

如果提供名称,Docker将创建以该名称命名的卷。

  - name: Run mariadb
    docker_container:
      name: mariadb-container
      image: mariadb
      env:
        MYSQL_ROOT_PASSWORD: "secret-password"
        MYSQL_DATABASE: "db"
        MYSQL_USER: "user"
        MYSQL_PASSWORD: "password"
      ports:
        - "3306:3306"
      volumes:
        - mariadb-data:/var/lib/mysql

mariadb-data 是由 Docker 自动创建的命名卷:


注:命名卷是 Docker 中一种用于持久化数据的机制,可以在容器之间共享和重用。
$ docker volume inspect mariadb-data
[
    {
        "Name": "mariadb-data",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/mariadb-data/_data",
        "Labels": null,
        "Scope": "local"
    }
]

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