Dockerで子プロセスからのstdoutをsupervisordにリダイレクトする方法

Dockerではsupervisordを使ってプロセス管理をする事が多いですね。
そのようなコンテナでは、以下のコマンドでsupervisordが吐いたログを確認できます:

docker logs -f <container_id>

さらに、子プロセスが吐いたstdout/stderrを同様に確認したくなることがあります。
例えばmysqlapache2のログなどです。
いちいちコンテナにログインしてtail -fなんてやってられませんよね。
supervisord.confを以下のように設定すれば、これら子プロセスのログをsupervisordに転送できます:

続きを読む Dockerで子プロセスからのstdoutをsupervisordにリダイレクトする方法

Dockerでビルド中にdevicemapperがエラーを発生する問題の対処法

docker

問題の概要

Dockerfileのビルド中に以下のようなエラーがランダムに発生するケースがあります:

Error getting container <container ID> from driver devicemapper: Error mounting

僕のケースでは、カーネルがLinux 3.13.0-40-generic、ディストリは Ubuntu 14.04.1 LTSでした。

Dockerのバグでカーネルのバージョンが原因

この問題はGitHubの下記issueで議論されています。

最近、vbatts氏が以下のようなコメントを投稿していました:

after a good bit of investigation, this appears to be an issue in the 3.13 kernel. There are abundant fixes for device-mapper/dm thin in 3.14 (and fixes/backports to 3.14.y and greater). Too many for me to bisect presently.

The state is that this issue is now only reproducible on ubuntu-14.04.1 LTS, which is locked on linux 3.13.0.

In my testing, even using the builds from http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.14.27-utopic/ allowed me to not hit this issue, but that would likely not be a “supported” resolution for many infrastructures…

I am reluctant to close the issue as fixed, as it is for newer kernels, because so many folks will be on ubuntu 14.04.1 LTS for a while… and will likely still hit this bug.

devicemapperがエラーを起こすのは、linuxのバージョンが3.13.0の場合に限るそうです。

Linuxのバージョンを3.13より上にする

Ubuntu 14.04の場合は、以下のパッケージをインストールします。

sudo apt-get install linux-image-3.16.0-29-generic

次に、システムを再起動してください。
カーネルのバージョンが正しくアップグレードされたことを確認します。

$ uname -a
Linux dev4 3.16.0-29-generic #39-Ubuntu SMP Tue Dec 16 20:54:13 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

これで、件のDockerのエラーは発生しなくなりました。