想通过 Ansible 构建多个 Dockerfile

Want to build multiple Dockerfile via Ansible

我正在尝试制作构建多个 Dockerfile 的 Ansible-Playbook


│   ├── aa
│   │   ├── 11
│   │   │   └── ubuntu.18.04
│   │   │       └── Dockerfile
│   │   ├── 22
│   │   │   ├── ubuntu.16.04
│   │   │   │   └── Dockerfile
│   │   │   └── ubuntu.20.04
│   │   │       └── Dockerfile
│   │   ├── 33
│   │   │   └── ubuntu.20.04
│   │   │       └── Dockerfile
│   │   └── 44
│   │   │   └── ubuntu.18.04
│   │   │       └── Dockerfile

我附上我的树结构。

有aa bb等多个目录

是否有更有效的方法来获取列表并生成构建命令?

我现在正在制作每一本剧本。 我认为这不是一个好方法,但至少按手头的每个构建命令仍然更好。

  - name: Build aa 11 ubuntu 18.04 images 
    command: docker build -t "{{basic_directory}}/aa/11/ubuntu.18.04:{{version}}" .

  - name: Build aa 22 ubuntu 16.04 images 
    command: docker build -t "{{basic_directory}}/aa/22/ubuntu.16.04:{{version}}" .

  - name: Build aa 22 ubuntu 18.04 images 
    command: docker build -t "{{basic_directory}}/aa/22/ubuntu.18.04:{{version}}" .

添加代码

  - find:
      path: "{{basic_directory}}"
      recurse: true
      patterns: 'Dockerfile'
    register: result

给定树

shell> tree conf/
conf/
└── aa
    ├── 11
    │   └── ubuntu.18.04
    │       └── Dockerfile
    ├── 22
    │   ├── ubuntu.16.04
    │   │   └── Dockerfile
    │   └── ubuntu.20.04
    │       └── Dockerfile
    ├── 33
    │   └── ubuntu.20.04
    │       └── Dockerfile
    └── 44
        └── ubuntu.18.04
            └── Dockerfile

和变量

  basic_directory: conf
  version: '1.0'

使用find模块获取路径列表

    - find:
        path: "{{ basic_directory }}"
        recurse: true
        pattern: Dockerfile
      register: result
  result.files|map(attribute='path')|list:
  - conf/aa/11/ubuntu.18.04/Dockerfile
  - conf/aa/33/ubuntu.20.04/Dockerfile
  - conf/aa/44/ubuntu.18.04/Dockerfile
  - conf/aa/22/ubuntu.20.04/Dockerfile
  - conf/aa/22/ubuntu.16.04/Dockerfile

迭代列表

    - debug:
        msg: >-
          command: docker build -t {{ item|dirname }}:{{ version }} .
      loop: "{{ result.files|map(attribute='path')|list }}"

给出(删节)

  msg: 'command: docker build -t /tmp/aa/11/ubuntu.18.04:1.0 .'
  msg: 'command: docker build -t /tmp/aa/33/ubuntu.20.04:1.0 .'
  msg: 'command: docker build -t /tmp/aa/44/ubuntu.18.04:1.0 .'
  msg: 'command: docker build -t /tmp/aa/22/ubuntu.20.04:1.0 .'
  msg: 'command: docker build -t /tmp/aa/22/ubuntu.16.04:1.0 .'

可选地,可以只查找目录,例如

    - find:
        path: "{{ basic_directory }}"
        recurse: true
        file_type: directory
        patterns: ubuntu*
      register: result
  result.files|map(attribute='path')|list:
  - conf/aa/11/ubuntu.18.04
  - conf/aa/33/ubuntu.20.04
  - conf/aa/44/ubuntu.18.04
  - conf/aa/22/ubuntu.20.04
  - conf/aa/22/ubuntu.16.04

迭代列表

    - debug:
        msg: >-
          command: docker build -t {{ item }}:{{ version }} .
      loop: "{{ result.files|map(attribute='path')|list }}"

给出相同的结果

  msg: 'command: docker build -t /tmp/aa/11/ubuntu.18.04:1.0 .'
  msg: 'command: docker build -t /tmp/aa/33/ubuntu.20.04:1.0 .'
  msg: 'command: docker build -t /tmp/aa/44/ubuntu.18.04:1.0 .'
  msg: 'command: docker build -t /tmp/aa/22/ubuntu.20.04:1.0 .'
  msg: 'command: docker build -t /tmp/aa/22/ubuntu.16.04:1.0 .'