Docker Container を利用したクリーンなローカル環境

こんにちは @muddydixon です。

docker をサービスでも利用していますが、ローカルの開発でもガシガシ利用しています。

コンテナでミドルウェアを利用したり、各種のマイクロサービスを整えた開発環境を構築したり、というのは王道だと思いますが、言語環境としても利用しています。

以前は xbuild を利用していたりもしたのですが、 mac だと brew や xcode 、 linux だと gcc や libXXX など各種依存ソフトウェアに悩まされていました。

また普通に container を立ち上げその中で vim をつかう、ということもしていたのですが、私は未だに emacs の呪縛から開放されない旧人類なので、コード自体はローカルのエディタを利用したいので「コレジャナイ」と思っていました。

課題

  • 言語のバージョンアップやそれに伴う依存関係に悩みたくない
    • Python 2 とか Python 3 とか
  • ローカルのエディタを使いたい

解決方法

  • 各種言語環境のイメージを起動する時にリポジトリのディレクトリに入って、 volume マウントをするだけ
% git clone XXX
% cd XXX
% docker run -it -d $(pwd):/opt --name $(basename $(pwd)) ${言語イメージ}

継続的にコードを書いて実行する場合は、

% docker exec -it -w /opt $(basename $(pwd)) bash
root@4223595b3f04:/opt#  

とコンテナの中に入っておいて、

  1. ローカルのエディタでコードを書く
  2. コンテナの中で実行する

とすればいいです。

テストコードとかもそのまま実行すればいいですしね。

必要なミドルウェアもコンテナの中にインストールすればいいですし、常に使うものなら docker-compose をおとなしく使えばもっと良いです。

もう一歩

docker exec-i を付けて標準入力やパイプを受け取れます。(-t をつけると仮想 TTY ができるので付けないようにします) こうすることで、例えば

% docker run -it -d intimatemerger/mecab
% alias mecab="docker exec -i ${CONTAINER ID} mecab"

としておけば

% echo "すもももももももものうち" | mecab 

とかできます。IPADIC だけでなく overlast さんの mecab-ipadic-neologd もコンテナの中でインストールしておけば、 ローカルの容量がいっぱいのときもコンテナを消せばいいだけで、「ローカルのどこにインストールされたんだろう・・・」とか捜索願を出さなくてすみます。

平和!

おまけ

HAROiD ではいくつかの credential 情報を databags に入れて git で管理しているのですが、 itamae-secret を使うためだけに ruby やその他の gem を入れるのは嫌でした。
そこで、上記のように

% git clone haroid_credentials
% docker run -it -d $(pwd):/opt --name databags ruby:latest
% docker exec -w /opt haroid_credentials gem install itamae-secrets

こうしておいて初回利用時にパスフレーズを入力しておきます。

% alias databags=docker exec -w /opt haroid_credentials itamae-secrets get

と登録しておくことで

% databags ${なんかクレデンシャル情報のキー}

とするだけで取り出せます。

便利!

まとめ

docker いろいろ便利ですね! (kube 難しいですね!

We are hiring!

HAROiD の採用情報はこちら

  • データサイエンティスト: 他の企業では手に入らないアカウントベースで紐付いた「視聴ログ」「Web閲覧ログ」を合わせて分析し、テレビの編成や営業、宣伝に入り込んであまねく多くの視聴者にサービスを届けることができます。
  • インフラ/アプリ/フロントエンジニア: テレビであなたのサービスをリリースすることができる!(かもしれません