Posted at

service と init.d の違いを docker で知る

More than 1 year has passed since last update.


経緯

dockerの勉強中に何故かapacheのコンテナでapacheが起動せず、コンテナにアクセスした上でコマンド起動。ところが、linkしたコンテナの環境変数が取得できない。コンテナにアクセスしたコマンドライン上では確認できるが、apacheでは取得できない(phpinfoで確認したが、phpの問題ではない)。

薄っすらと記憶はあったものの、なにがどうなっているのかわからなかったので、結構時間を食う。まぁ、学習コストは高くつくものです。

最終的に、「なぜinit.dではなくserviceを使うべきか」という内容の記事を思い出した。


apache起動しない問題

こちらは本題ではないので、軽くしか触れないが、いずれ。

dockerで複数のコンテナを起動しコンテナ同士をつなぐ、というかなり初歩的なところで躓いた。まずは、mysqlのコンテナを起動し、続いてアプリケーション用のapacheのコンテナを起動。そして、コンテナに接続する。Dockerfileには起動コマンドが「一個だけ」書いてあり、FOREGROUNDで動作するようになっている。のに、apacheは起動しなかった。


apacheが起動しない原因

原因としては単にDockerfileのCMDとdocker runのコマンドオプションが重複していたのでapacheが起動しなかっただけなのだが、コマンドラインでは確認できる環境変数が、apacheに反映されない事象が起きる。すなわち、mysqlの情報が受け渡せない。

オ〜〜マイ・ガッ。


何が原因かわからない

正直、ほとんど記事になっていないと思われる。手元の環境でCentOSを使う人はもはや少ないのか。おそらく、RedHat、Fedora、CentOSなどでは起こるがDebian系のLinuxでは起きないのだと思う。

DockerはどうやらDebian推奨のようなので、あまり話題にのぼらないのか。


兎に角、CMDと同じように起動してみると

DockerfileのCMDでは、直接httpdコマンドをFOREGROUNDで起動する。起動スクリプトは使わない。ので、そのように。

!!

出た、環境変数。ただ、理由はまったくわからない。なにか、引っかかるものはあるのだが明確にならない。

そして、init.dで起動しても環境変数は取得できる…あれ?

serviceでは取得できない。

どっかでそのような話を聞いたような…。


これが答えだ

デーモンの起動・終了にはserviceコマンドを利用しよう 2013年6月24日

そう、serviceコマンドは環境変数を引き継がない。そして、CentOSにどっぷり浸っていた私は、目をつぶってserviceを叩いた。これは実行者によらず、安定して動作するってことで重要なことなんだと理解している。

そう、そもそも実行者の環境変数なんていうものに依存するのはどうなんだろう、と思いつつ、このあたりでCMDの重複に気づいたのでした。

結局は、DockerfileのCMDで起動するapacheは環境変数を持てるのだが、それに依存してアプリケーションを構築するのは、開発環境以外では危険かなと。