概要
- ansible を使って開発環境用の docker コンテナを作成しようとしたが、ansible-bender を使う方法は、podman と buildah が必要らしく(参考:Ansibleを使ってdockerコンテナを立ち上げる)、MacOS 用の buildah が配布されていないようなので、別の方法を調べてみた。
- ansible の community.docker に含まれるモジュールは、ansible が結局、ssh 接続を前提としているので、パッケージのインストールなど、やりたいことができない。(image や container を外側から触ることはできるが、中身の操作は不可)
- よって、ansible 側から docker のイメージやコンテナを操作するのではなく、Dockefile で docker イメージを構築する際に、イメージ内に ansible をインストールし、そのイメージ内で ansible をローカル実行して、自分自身に必要なパッケージのインストールや設定を行うようにする。(ansible のエージェントレスという利点は失われてしまうことになるが)
環境
- macOS Catalina (10.15.1)
- Docker version 20.10.0, build 7287ab3
- ansible 2.10.3
やったこと
-
ansible の実行に必要なディレクトリやファイル、rpm パッケージを全て docker コンテナ側へコピーする。コンテナ内で ansible をローカル実行させるため。
-
python, pip のインストール。
-
ansible-galaxy から必要なロールのインストール。(community.general, community.crypto)
-
いくつかのサービス(chrony, http, mackerel, sshd)起動の設定を外す。docker には1コンテナ1サービスの概念があり、コンテナ内のサービスを制御するのではなく、コンテナ自体の起動、停止によるコントロールが前提となっており、サービスの起動・停止などのコントロールはできないため。
-
Dockerfile 内で必要なポートを開け(EXPOSE 80 443)、docker run でコンテナ起動時に、それを指定する。
-
Dockerfile
FROM centos:centos8 RUN dnf clean all && rm -r /var/cache/dnf && dnf upgrade -y && dnf update -y RUN dnf install -y sudo RUN dnf install -y python3-pip RUN pip3 install ansible RUN ansible-galaxy collection install community.crypto RUN ansible-galaxy collection install community.general ## ansible の実行に必要な設定ファイルをディレクトリごとコピーし、 ## それらを全て dev.yml ファイルから読み込む COPY ./ ./. RUN ansible-playbook dev.yml EXPOSE 80 443 CMD ["/bin/bash"]
-
イメージ作成とコンテナ起動時の実行例
## イメージの構築 $ cd (Dockerfile のあるディレクトリ) $ docker build -t web/dev:1.0 . ## コンテナ起動 $ docker run -itd -p 80:80 -p 443:443 --name test web/dev:1.0
参考
以上。