ansible-bender でコンテナイメージを作成する 

# 概要

Ansible と同じ書式で、コンテナイメージの作成手順を指定することができる ansible-bender を試してみた。

# 環境構築

[手順書](https://ansible-community.github.io/ansible-bender/build/html/installation.html)にしたがって、[ansible-bender](https://github.com/ansible-community/ansible-bender) をインストールする。

```shell-session
$ sudo pip3 install ansible-bender
```

ansible-bender は内部的に buildah と podman を呼び出すので、[手順書](https://github.com/containers/buildah/blob/master/install.md)にしたがって、buildah と podman をインストールする。参考までに、私が使っている ansible playbook は[以下の通り](https://gist.github.com/tsuchm/e40b17af389321e4858e48eb51a49eb3)。

# 最小コンテナイメージを用意する

ansible-bender は Python がインストール済みのコンテナイメージが必要。だが、[DockerHub で配布されている Debian イメージ](https://hub.docker.com/_/debian)には、Python がまだ含まれていないので、このイメージに対しては ansible-bender は適用できない。

そこで、Python を含む最小のコンテナイメージを用意しておくと便利である。まず、以下のような Dockerfile を用意する。

```conf:Dockerfile
FROM debian:buster
MAINTAINER Anatano Namae <namae@example.jp>
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y python3 && apt-get clean
```

次に、以下のコマンドを実行して、debian-python3 という名前のコンテナイメージを作成する。

```shell-session
$ sudo podman build -t debian-python3:buster -f Dockerfile
```

作成が完了すれば、以下のようにイメージ一覧に表示されるようになるはずである。

```shell-session
$ sudo podman images
REPOSITORY                 TAG      IMAGE ID       CREATED          SIZE
localhost/debian-python3   buster   7b80a3ed5790   42 seconds ago   199 MB
```

# ansible-bender でコンテナイメージを作成する

コンテナイメージを作成するための手順書を、Ansible とほぼ同じ形式で用意する。

```conf:sample.yml
- name: ntpd container
  hosts: all
  vars:
    ansible_bender:
      base_image: debian-python3:buster
      target_image:
        name: debian-ntpd:buster
  tasks:
   - name: install ntpd
     apt:
       name: ntpd
       state: latest
```

手順書の書き方詳細については、[ansible-bender のドキュメント](https://ansible-community.github.io/ansible-bender/build/html/index.html)を参照。

後は、以下のコマンドを実行すれば良い。

```shell-session
$ sudo ansible-bender build sample.yml
```

正常にコンテナイメージの作成が完了すると、以下のコマンドでイメージができていることが分かる。

```shell-session
$ sudo podman images
REPOSITORY              TAG      IMAGE ID       CREATED          SIZE
localhost/debian-ntpd   buster   ab26e1f28761   13 minutes ago   223 MB
```

なお、最新の ansible-bender はバックエンドとして buildah のみをサポートしており、docker サポートは打ち切られている。そのため、直接 docker 形式のコンテナイメージを作成することは **できない** 。

インストールするパッケージが多い場合は、構築時間短縮のために `HTTP_PROXY` を指定するなど細かい調整が必要になるのだが、設定方法の調査が完了していない。

# 作成したコンテナイメージを実行する

以下のコマンドで、podman のコンテナイメージを実行することができる。

```shell-session
$ sudo podman run -ti localhost/debian-python3:buster /bin/bash
```

`/bin/bash` の実行が終了しても、コンテナ環境は確保されたままになっているので注意が必要。全ての実行中のコンテナ環境を破棄するには、以下のコマンドを実行する。

```shell-session
$ sudo podman rm -f `sudo podman ps -aq`
```

# 作成したコンテナイメージを docker 形式に変換する

podman で形式を指定せずにエクスポートすると、docker-archive 形式で保存される。

```shell-session
$ sudo podman save --output debian-python3.tar localhost/debian-python3:buster
```

または、buildah と docker の両方がインストールされていれば、以下のコマンドで podman のコンテナイメージを、同一ホストの docker に転送することができる。

```shell-session
$ sudo buildah push debian-python3:buster docker-daemon:debian-python3:buster
```

# 作成したコンテナイメージを singularity 形式に変換する

singularity は docker-archive 形式をサポートしているので、以下のコマンドで変換することが可能である。

```shell-session
$ singularity build debian-python3.sif docker-archive://debian-python3.tar
```