eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

Dockerで開発環境をポータブルにする

なぜDockerfileに記述するのか

  • pullするだけでセットアップが終わる
    • 手軽に再現できる
  • 複数OSの上で同じ環境を使える
    • WindowsMacで作業中にLinux環境が必要になる場合がある
    • OSや環境固有の問題なのか、別な問題なのかの切り分けを行いたい
  • 開発環境のバージョン管理を行える
    • 古い環境や、特定用途に特化した内容等を構築しておける
  • 環境を壊すことを恐れずにコマンド実行が行える
    • 壊れても再度コンテナを起動すれば良い

Docker Imageの保存先

  • 個人のみで使うプライベートリポジトリを用意しなければならない
    • gitへのアクセスを簡略化したいので、秘密鍵を使いまわしているため
    • コンテナ内で生成しても良いけど、毎度アクセス権限設定するのがかなり手間になる
  • gcr.ioにpushすると、自分のGCPプロジェクト内に保存できる
    • Google Cloud Storageに格納される
    • gcr.io/your-project-name/path/to/image:version
    • バージョンが増えてくると課金が嵩むので、ストレージのライフサイクルを調整する
    • あとはDockerfileだけ残して削除するとか
      • ただし、リンク切れとかの影響で docker build が成功するとは限らないという点に留意する
      • tar-ballにしてローカルのNASとかに入れてしまうのもアリかもしれない
  • pullするとき
gcloud docker -- pull gcr.io/your-project-name/path/to/image:version
  • pushするとき
# 事前に命名規約に従ってtag付しておくか、↓ではなくGoogle Cloud Container Builderを使用する
gcloud docker -- push gcr.io/your-project-name/path/to/image:version

基本的なDocker Image構成

  • 開発環境はUbuntuベースで行うことが多い
    • いつもUbuntuなので、 apt 等のコマンドが使えるほうが便利
  • たまにCentOSとかを使う

いつも使う設定ファイルを放り込む

  • 使いまわす秘密鍵とか、 .bashrc ファイルとかを手軽に突っ込みたい
  • 次のようなディレクトリ構成にして、tar-ballを生成する
    • ADDでルートディレクトリに放り込めば、そのままのディレクトリ構成で再現される
    • 署名鍵とかの扱いは注意しなければならない
      • Docker Imageに特定の秘密鍵が含まれることになるので、 他人に共有してはならない
$ tree -al .
.
├── Dockerfile
└── files
    ├── root
    │   ├── .ssh
    │   │   ├── id_rsa
    │   │   └── id_rsa.pub
    │   ├── tools
    │   │   ├── git-completion.sh
    │   │   └── git-prompt.sh
    │   └── ubuntu.bashrc
    └── usr
        └── local
            └── bin
                ├── git-overview
                └── git-today
# ./files.tar.gz を生成する
(rm -f files.tar; cd files; tar cfvz ../files.tar.gz .; cd ../) >> /dev/null
# ルートディレクトリにADDしてパーミッションを設定すれば手軽に環境を放り込める
ADD files.tar.gz /
RUN  chmod -R +x /usr/local/bin \
  && chmod -R +x $HOME/tools \
  && chmod -R 0600 $HOME/.ssh \
  && echo 'source $HOME/ubuntu.bashrc' >> $HOME/.bashrc

各種環境の特盛りDockerfile

使いやすいようにaliasする

  • Terminalから devkit コマンドでいつでもクリーンな作業環境に入れるようにする
  • 基本的にcleanな環境で使いたいので、 --rm オプションをつけて毎度削除する
  • gradleやgolangのキャッシュはコンテナ間で使いまわしている
  • $HOME/work をいつもワーキングディレクトリにしているので、マウント&ワーキングディレクトリに指定して作業を開始しやすくしている
# .bashrcあたりに追記しておく
export DEVKIT_CONTAINER="gcr.io/your-project-name/path/to/image:version"
alias devkit="docker run --rm -it \
              -e GOPATH=/root/.gopath \
              -v $HOME/devkit/.gopath:/root/.gopath \
              -v $HOME/devkit/.gradle:/root/.gradle \
              -v $HOME/devkit/.m2:/root/.m2 \
              -v $HOME/work:/work \
              -w /work \
              $DEVKIT_CONTAINER"