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


概要

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

環境構築

手順書にしたがって、ansible-bender をインストールする。

$ sudo pip3 install ansible-bender

ansible-bender は内部的に buildah と podman を呼び出すので、手順書にしたがって、buildah と podman をインストールする。参考までに、私が使っている ansible playbook は以下の通り

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

ansible-bender は Python がインストール済みのコンテナイメージが必要。だが、DockerHub で配布されている Debian イメージには、Python がまだ含まれていないので、このイメージに対しては ansible-bender は適用できない。

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

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 という名前のコンテナイメージを作成する。

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

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

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

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

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

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 のドキュメントを参照。

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

$ sudo ansible-bender build sample.yml

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

$ 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 のコンテナイメージを実行することができる。

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

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

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

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

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

$ sudo buildah push debian-python3:buster docker-daemon:debian-python3:buster

その上で、以下のように docker save と docker load を組み合わせれば、他ホストに docker コンテナイメージを転送できる。

$ sudo docker save debian-python3:buster | ssh docker.example.net sudo docker load

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

singularity は oci-archive 形式をサポートしているので、以下の手順で変換することが可能である。

$ sudo podman save --format oci-archive --output debian-python3.tar localhost/debian-python3:buster
$ singularity build debian-python3.sif oci-archive://debian-python3.tar