【Docker】Serverspecを用いたDockerのテスト
Dockerfileもある程度かけてきて、次のステップとしてちゃんとイメージが構成されているのか、をテストする方法を実際に構築したDockerfileを用いて記載したいと思います。
Dockerfile
まずはDockerfileに構築したい環境を記述していきます。
下記のDockerfileはCentOSにserverspecとansibleの環境を構築したサンプルです。
そのうちwerckerのイメージで使えるか試そうかと構築したものです。
FROM centos:6 MAINTAINER hogehoge RUN yum update -y # install dependency RUN yum install -y git tar gcc openssl-devel epel-release \ libyaml-devel readline-devel zlib-devel \ libffi-devel libxml2-devel libxslt-devel # install ruby RUN curl -O http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz RUN tar xvzf ruby-2.2.2.tar.gz -C /usr/local/share RUN cd /usr/local/share/ruby-2.2.2 && ./configure && make && make install RUN echo "gem: --no-rdoc --no-ri" >> $HOME/.gemrc # install rake & serverspec RUN gem install bundler && gem install serverspec # install ansible RUN yum install -y ansible
Dockerfileビルド
とりあえず、Dockerfileが完成したので、ビルドしてイメージを作成します。
$ docker build -t serverspec-ansible:0.0.1 . $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE serverspec-ansible 0.0.1 f67f629b5d81 36 minutes ago 872.2 MB $ docker run serverspec-ansible:0.0.1 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 32666c60522e serverspec-ansible:0.0.1 "/bin/bash" 5 seconds ago Exited (0) 5 seconds ago mad_bell
これで一旦準備完了。
serverspecでテスト記述
必要モジュールのインストール
serverspecは最低限必要として、dockerを扱う場合、docker-api
が必要なのでインストールします。
docker-api | RubyGems.org | your community gem host
$ gem install serverspec $ gem install docker-api
※ モジュール名はdocker-apiだが、requireするときにはdocker
なので注意が必要
spec_helper
serverspec
&docker
を使用するための記述を行います。
# coding : utf-8 require 'serverspec' require 'docker' # backendを :dockerで指定 set :backend, :docker # docker_urlに`DOCKER_HOST`を指定 set :docker_url, ENV["DOCKER_HOST"] # sslを無効にしておく Excon.defaults[:ssl_verify_peer] = false
とりあえず上記で一旦はOKです。
テストの記述
では実際にテストを記述していきます。といっても、ここからはserverspec
の書き方に合わせるだけなので、詳しい説明は省略します。↓こちらでいちおう触れてますcarefree-se.hatenablog.com
ポイントとしてはテスト実行前にdocker関連の設定を記述する必要があります。(spec_helperでもよかったかもしれん...)
# coding : utf-8 require 'spec_helper' describe "Dockerfile" do before(:all) do # Dockerfileがあるカレントディレクトリを指定 image = Docker::Image.build_from_dir('.') # テスト対象のOSタイプを指定 -> これはserverspecの設定か set :os, family: :redhat # docker imageの指定 set :docker_image, image.id end def os_version command('cat /etc/issue').stdout end # osのバージョン確認 it 'installs the right version of CentOS' do expect(os_version).to match(/CentOS/) end # packegeを落としてきてるので、展開時にディレクトリが存在するかのテスト it 'package exists' do expect(file('/usr/local/share/ruby-2.2.2')).to be_directory end # rubyがインストールされているかをテスト it 'install check ruby' do expect(command('ls -la /usr/local/bin').stdout).to match(/ruby/) expect(file('/usr/local/bin/ruby')).to be_executable expect(command('ruby --version').stdout).to_not be nil end # serverspec及びrakeがインストールされているかテスト it 'install check serverspec' do expect(command('ls -la /usr/local/bin').stdout).to match(/serverspec/) expect(file('/usr/local/bin/gem')).to be_executable expect(file('/usr/local/bin/rake')).to be_executable expect(file('/usr/local/bin/serverspec-init')).to be_executable expect(command('gem list').stdout).to match(/serverspec/) expect(command('gem list').stdout).to match(/rake/) end # ansibleがインストールされているかテスト it 'install check ansible' do expect(file('/usr/bin/ansible')).to be_executable expect(command('ls -la /usr/bin').stdout).to match(/ansible/) expect(command('ansible --version').stdout).to_not be nil end end
所感
serverspec
がどうというよりは、docker-api
をもう少し深追いしてみようかなと。思っていた以上にいろいろ出来そう。
今回作成したものをgithubにあげてますので、参考までに
参考
ServerspecのDockerバックエンドでコンテナをテストする。 - タチコマ好きなエンジニアのブログ
このシリーズ好きだな〜w