なぜDockerfileに記述するのか
- pullするだけでセットアップが終わる
- 複数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
gcloud docker -- push gcr.io/your-project-name/path/to/image:version
基本的なDocker Image構成
いつも使う設定ファイルを放り込む
- 使いまわす秘密鍵とか、
.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
(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
をいつもワーキングディレクトリにしているので、マウント&ワーキングディレクトリに指定して作業を開始しやすくしている
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"