使用 Ansible 的 Docker NFS 卷

Posted

技术标签:

【中文标题】使用 Ansible 的 Docker NFS 卷【英文标题】:Docker NFS volume using Ansible 【发布时间】:2020-08-31 07:27:03 【问题描述】:

举个简单的例子,比如

$ docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.1.1,rw \
    --opt device=:/path/to/dir \
    foo

如何使用 Ansible 做同样的事情?例如我试过了

- name: NFS volume mount
  docker_volume:
    driver: "local"
    driver_options:
      type: nfs
      o: "addr=192.168.1.1,rw"
      device: /path/to/dir
    volume_name: foo

这将在没有错误的情况下创建卷,但当卷与docker_container 模块一起使用时它将失败。

TASK [oracle-database : docker_container] **************************************
fatal: [oracle]: FAILED! => "changed": false, "msg": "Error starting container 1beb3254e25a8fe47cd78e803a2050f24020cf72e138472d7d14d963e02bec7f: 500 Server Error: Internal Server Error (\"\"message\":\"error while mounting volume '/var/lib/docker/volumes/foo/_data': failed to mount local volume: mount /path/to/dir:/var/lib/docker/volumes/foo/_data, data: addr=192.168.1.1: invalid argument\"\")"

当我使用 Ansibe 创建卷时

[root@oracle ~]# docker volume inspect oracle-dumps
[
    
        "CreatedAt": "2020-08-31T02:07:14-07:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/foo/_data",
        "Name": "foo",
        "Options": 
            "device": "/path/to/dir",
            "o": "192.168.1.1,rw",
            "type": "nfs"
        ,
        "Scope": "local"
    
]

当我使用 docker volume create 手动创建卷时:

[root@oracle ~]# docker volume inspect oracle-dumps
[
    
        "CreatedAt": "2020-08-31T02:07:14-07:00",
        "Driver": "local",
        "Labels": ,
        "Mountpoint": "/var/lib/docker/volumes/foo/_data",
        "Name": "foo",
        "Options": 
            "device": "/path/to/dir",
            "o": "192.168.1.1,rw",
            "type": "nfs"
        ,
        "Scope": "local"
    
]

除了标签属性,看起来几乎一样。

容器的docker inspect在体积上是一样的

        
            "Type": "volume",
            "Name": "oracle-dumps",
            "Source": "/var/lib/docker/volumes/foo/_data",
            "Destination": "/otherpath/to/dir",
            "Driver": "local",
            "Mode": "rw",
            "RW": true,
            "Propagation": ""
        

所以结论是存在错误,但在哪里?安西布尔?码头工人-py?码头工人?

解决方法是

- name: Create dump volume
  command:
    cmd: "docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.1,rw --opt device=:/path/to/dir foo"

【问题讨论】:

你试过去掉o参数周围的“”吗? 是的,试过了,同样的问题 嗯,你确定你删除了不同测试之间的卷吗?如果我运行与您相同的docker volume create,我会得到"o": "addr=192.168.1.1,rw" 而不是"o": "192.168.1.1,rw" 【参考方案1】:

问题是缺少:。设备路径应为:/path/to/dir

- name: NFS volume mount
  docker_volume:
    driver: "local"
    driver_options:
      type: nfs
      o: "addr=192.168.1.1,rw"
      device: :/path/to/dir
    volume_name: foo

【讨论】:

以上是关于使用 Ansible 的 Docker NFS 卷的主要内容,如果未能解决你的问题,请参考以下文章

Docker/Docker-Compose 中的 NFS 卷

Docker Swarm - NFS 共享数据卷

Docker 卷挂载 NFS 共享的权限测试问题

docker volume nfs 权限被拒绝

解决 Docker 数据卷挂载的文件权限问题

docker-数据管理的备份与恢复