dockerのオレ的ノウハウメモ

2016-03-09
docker

dockerの自分ノウハウが少し溜まってきたのでメモ。

Dockerfileからプライベートリポジトリをpullする。

Clone private git repo with dockerfile - stackoverflow

Web上でも色々と話されているけど、コレっていう解決策はまだ見てない。
以下の2つが現状でのやり方候補。

  1. BuildするサーバのユーザがcloneしてADD
    docker buildを実行するユーザの公開鍵をdeploy keyとして登録する方法。
    buildを実行するユーザがリポジトリをcloneして、コンテナにADDする。

  2. 公開鍵と秘密鍵のセットを、Dockerfileと共に使うパターン
    事前にdeploy keyとして登録しておいたパス無しの鍵セットを、コンテナに追加するパターン
    上記のstackoverflowでもその方法が書いてある。

今のところ、後者の方法を使っている。秘密鍵をリポジトリに突っ込むのは抵抗があるのですが・・・。
他の人はどうやっているんだろ。

docker-composeで特定のコンテナだけビルド

普通に docker-compose buildってやると、docker-compose.ymlに指定された全てのコンテナがビルドされる。
コンテナが増えてくると、buildだけで相当時間がかかるので、コンテナ指定しましょう。

1
docker-compose build {コンテナ名}

–no-cacheつけると、キャッシュ無視も出来る。
ただし、キャッシュ無視は時間かかるのでちょっとアレです。

コンテナ内のgit管理のソースコードだけ更新する

普通に RUN git cloneとかやっている場合、コマンドに変更がない限りdockerはキャッシュを優先させるので、ソースに変更があってもコンテナ内に取り込まれない。
--no-cacheオプションをつけると、全部ビルドしなおしが出来るけど、時間が掛かり過ぎる。
なんとかcacheを利用しつつ、ソースの変更は取り込みたい。

これもいろんな方法が提案されてたけど、CMDを使う方法で落ち着いた。
CMDはコンテナをdocker runさせるときに実行されるので、CMDにshellを指定してその中でrunの時に更新したいコマンドを指定する。

例: run.sh

1
2
3
4
5
#!/bin/bash

git pull origin master && \
npm run gulp && \
nginx -g "daemon off;";

そして、Dockerfile側では・・・

1
2
3
4
ADD run.sh
RUN chmod +x run.sh

CMD ./run.sh

こうすれば、dockerのcacheを利用しつつ、ソースの更新が出来る

docker-composeで、特定のコンテナだけ再読み込み

1
docker-compose up -d --no-depth --force-recreate {コンテナ名}
  • --no-depth
    リンクしている子コンテナ群は再読み込みしない。
  • --force-recreate
    ビルドし直したコンテナで再起動してくれる。
    つけないと、元のコンテナイメージをそのまま再起動する。

ホスト側のフォルダをマウントしている場合に、マウント先のシンボリックリンク書き換えとか、そういうのの更新は--force-recreateつけなくても出来そう。(試してない)

docker-composeで、ステージング・プロダクションを切り分け

借りてるレンサバが1台なので、コレが辛かった。
2台借りてるなら、サーバ代えろでオワリな気がする。

docker-compose.ymlを docker-compose_staging.yml, docker-compose_production.ymlとかで分割。
stagingとかproductionという文字列の部分はCIツールで使える環境変数名とかにする。

docker-compose実行時に -f docker-compose_staging.ymlで設定ファイルを指定して実現した。

公開ポートについては、ホスト側のポートの奪い合いにならないようにはきちんと管理しなきゃいけないけど、そこ以外は全然問題なし。

wercker経由でデプロイする場合も、werckerの環境変数を使って、デプロイの区別が出来て便利。