dockerの自分ノウハウが少し溜まってきたのでメモ。
Dockerfileからプライベートリポジトリをpullする。
Clone private git repo with dockerfile - stackoverflow
Web上でも色々と話されているけど、コレっていう解決策はまだ見てない。
以下の2つが現状でのやり方候補。
BuildするサーバのユーザがcloneしてADD
docker build
を実行するユーザの公開鍵をdeploy key
として登録する方法。
buildを実行するユーザがリポジトリをcloneして、コンテナにADDする。公開鍵と秘密鍵のセットを、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 |
|
そして、Dockerfile側では・・・
1 | ADD 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の環境変数を使って、デプロイの区別が出来て便利。