Dockerイメージがイミュータブルじゃ無くなった話
沖縄のお盆は旧暦の7月13日から15日、ということで2014年は8月8日(つまり昨日)がウンケー(お迎え)でした。
そんな日にデプロイ作業をしてたからハマった(?)のかどうか知りませんが、Docker on Elastic Beanstalkの小咄を1つ。
プロダクション環境でDockerを利用している方は、ビルドの時間を短縮するためにだいたいこんな感じでイメージを作っているかと思います。
弊社の場合は、それぞれにこんなものが入っています。
- baseにはJava環境やsupervisord/sshdなど、どんな場合でも絶対使うもの(最近ここにcronを入れましたw)
- appenvにはアプリケーション環境に固有なユーザやミドルウェアなど。例えばgvmやvert.xなどが含まれます。
- latestには最新のアプリそのものと一緒に、Elastic Beanstalkにデプロイします
latestのビルド時間を出来うる限り短縮したい、という話ですね。
で、それぞれのイメージのビルド周期は図のように、右に行くほど頻繁にビルドされます。と言うか左の2つは必要がなければいじりません。
んで、最近のミドルウェアには大概自動アップデートの機能が付いているかと思います。gvmにもご多分に漏れず、付いています。
ということは、appenvのイメージを作った時点では最新だったけど、latestを作った時にミドルウェアの自動アップデートが走って、もしアップデートが提供されていたら?
はい、Immutable Infrastructureだったつもりのイメージが、時期によっていきなり自分自身で更新が掛かって壊れてしまいますね!(汗)
ううむ、そうならないようにアップデートoffにしたり、オフラインの設定にしていたんですが、そのオプションが効いてなかったのか、、、gvmやるな(違)。
(健気に標準入力で「アップデートする?」って聞いてきて
Beanstalkのデプロイがコケたのは秘密です。)