実際に使うDocker超入門 (第2回)

1 Comment

こんにちはtatsyです。

今回は「実際に使うDocker超入門」の第2回です。今回は自前のDockerfileを作成し、Docker Hubにpush、そしてTravis CIでDockerを使ったテストを行う方法を紹介したいと思います。

前回の記事はコチラからご覧になれます。
 

自前のDockerfileを作る


では、前回ご紹介した内容を踏まえて自前のDockerfileを作って見たいと思います。

私が今回作成したDockerfileはUbuntu 14.04 LTS上でCMakeを用いたC++のビルドを実行するための環境です。

少し長いですが、実際に作成したDockerファイルは以下のようなものです。

若干前回ご紹介したものよりも長いですが、特別なことは何もしていません。

前回ご紹介したUbuntuのDockerfileに加えて、GCC 4.9.2, Clang 3.7.0, CMake 3.3.2をインストールして、最後にバージョンの確認を行っているだけです。

以後は、このDockerfileをTravis上でdocker buildして、Docker Hubに自動的にpushする方法を紹介します。
 

Docker Hubアカウントの作成


Docker Hubアカウントの作成は、

Docker Hub

にアクセスしてアカウント登録をするだけです。

私の個人的な見解として、Docker Hubのユーザ名、メールアドレス、パスワードはTravis上に打ち込まないといけない(他のユーザからはもちろん見えません)ので、あまり良くつかっているパスワードを入れない方がいいかもしれません。

他のサービスみたいに認証用トークンを発行してくれるとありがたいのですが、今のところは対応していない状況です。
 

Travis CIからDocker Hubへの自動push


Docker Hubアカウントが作成できたら、GitHub上にレポジトリを作成し、Travis CIとの連携をONにします。

私が今回作成したGitHubのレポジトリはこちらになります。

tatsy/docker-ubuntu-cxx – GitHub

.travis.ymlの書き方ですが、基本はdocker buildを実行してDockerfileからイメージを作り、それをDocker Hubにpushするという流れになります。

第一に、Travis CI上でDockerを使うためにはservicesにdockerを指定する必要があります。

後はinstallの箇所にdocker buildを指定してあげるだけです。

確認用にちゃんとビルドが出来ているかをafter_installで確認してあげるとよりGoodかもしれません。

続いて、ビルドが上手く言った後にDocker Hubへpushする方法ですが、.travis.ymlに打ち込むべき情報は次のようになります。

一行目ではDocker Hubへのログインを、二行目では実際のpushを実行しています。

なおDocker Hubへのpushでは、レポジトリの名前とローカルでのイメージ名をそろえてあげる必要があります。

そのため、今回のビルドではタグをtatsy/ubuntu-cxx:latestにして、それをpushするときにも使っています。

次にもう一つの注意点として、docker login時のアカウント情報の入力があります。

上の例ではメールアドレス、ユーザ名、パスワードが環境変数として設定されていますが、間違っても、パスワードの情報を.travis.ymlのenvなどに打ち込まないでください。

Travis CIではレポジトリごとに環境変数を設定することができて、ここに他のユーザに見せたくない環境変数を設定しておくことが出来ます。

設定したいレポジトリのSetteingsを開くと以下のような画面ができるので、Addを押して環境変数を入力します(下の画像ではもう入力済みです)。

travis_setting

これで準備は完了で、自分のGitHubにDockerfileをpushすればTravis上でビルドが始まり、ビルドが成功すればDocker Hubにpushされます。

なおpushには地味に時間がかかりまして、今回の私の例だとイメージのサイズが1.5GBで、pushにかかった時間は274秒でした。
 

Travis CI上でDockerを使ったビルド/テスト


これで自前のビルド環境をDocker Hubにpushすることができました。

あとは自分のサーバー上のJenkinsで使うなり、Travis CIで使うなり、Dockerさえインストールされていれば、どの環境でも同じビルド環境を使うことが出来ます。

Travis CIで使う場合にはいちいち必要なソフトウェアをインストールする必要がなくなるのでビルド時間も短縮できて良い感じです。

では、早速Travis CI上でDockerを使ったビルド/テストを実施する方法をご紹介します。

とはいえ、こちらも特に特別なことは必要ありません。単に作成したDocker Hub上のイメージをpullしてきて、そのイメージをコンテナとして実行した上で、ビルドとテストを行うだけです。では.travis.ymlの設定方法を順に見ていきます。

まず、DockerをTravis上で使うためにservicesにDockerを指定します。これは先ほどと同じですね。

次にdocker imageをpullします。

そうするとローカルにイメージが現れます。あとはビルドなどの情報を入れたDockerfileをdocker buildします。

このDockerfileはFROMに、落としてきた自前のイメージ名を入れて、ビルドやテストをRUNで実行するものです。

手前味噌ながら、自分の趣味レンダラーでは次のようなDockerfileを使っています。

やっていることは、

  • プロジェクト特有のライブラリのインストール (上記の例ではfreeglutとGLEWおよびGoogleTest)
  • プロジェクトのビルド

です。

上記のDockerfileをビルドしてあげると、プロジェクトのビルドが終わった状態になっているので、あとはテストとカバレッジデータの集計を手動で行います。
 

docker execによるコマンドの逐次実行


テストとカバレッジデータの送信を順に行うためにはdocker execコマンドを使います。

なお、docker execは1.3以上の機能なので、使っているDockerのバージョンに注意してください。

docker execは起動しているコンテナ内でコマンドを実行するためのコマンドで使い方は次のようになります。

例えばmake checkでテストを実行したいとすると、

のようになります。

docker execに渡すコンテナ名はイメージ名ではないので、これはコンテナを起動する時に–nameオプションで設定します。

この後でカバレッジデータの集計等を行いたい場合には、同様にdocker execを使って逐次的にコマンドを実行してあげればOKです。

使い終わったコンテナは停止した後にdocker rmを使って破棄しておきましょう。

ビルドしたイメージを削除したい場合にはdocker rmiコマンドを使います。

 

まとめ


今回は自前のDockerfileの作成から、そこから作成したイメージを使ってのビルド/テストおよびカバレッジデータの集計方法までをご紹介いたしました。

簡単にポイントをまとめておくと

  • Dockerfileを作成したらGitHub + Travis CIで自動的にDocker Hubへホスティングできる!
  • Docker Hub上のイメージを使えば、Travis CIでのビルド時間を結構短縮できる
  • Dockerコンテナ内でのコマンド実行にはdocker execを使う

という感じです。

それでは、これで今回の記事を終わりたいと思います。今回も最後までお読みいただき、ありがとうございました。


One thought on “実際に使うDocker超入門 (第2回)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です