LoginSignup
8
2

More than 1 year has passed since last update.

httpdイメージに指定されているコマンド「httpd-foreground」って何だ

Posted at

apache(httpdデーモン)の起動はserviceコマンドやsystemctlコマンドで起動する事が多いと思いますがdocker container lsでhttpdイメージのCOMMANDの欄を見た時にhttpd-foregroundが指定されていてこれ何だろうと思ったので調べてみました。

大前提としてコンテナはCMDコマンドやENTRYPOINTコマンドで指定したコマンドが終了したらコンテナ自体も終了する仕組みです(下記の記事が分かりやすかったです)
参考:https://architecting.hateblo.jp/entry/2020/08/13/153842

結論:httpd -DFOREGROUNDコマンドを実行する事によってhttpdデーモンをフォアグラウンドで起動している。

実際にhttpdイメージのリポジトリを見ていきます。

httpdイメージのdockerfileのCMDコマンドがこの様な指定されていました。

~省略~
COPY httpd-foreground /usr/local/bin/

EXPOSE 80
CMD ["httpd-foreground"]

COPYコマンドでhttpd-foregroundが/usr/local/bin/にコピーされています。CMDコマンドで指定されているhttpd-foregroundを見てみます。

#!/bin/sh
set -e

# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid

exec httpd -DFOREGROUND "$@"

httpd -DFOREGROUNDが実行されています。これはhttpdデーモンをフォアグラウンドで起動する事を意味しています。

serviceコマンドを使うとバックグラウンドで実行した後serviceコマンド自体は終了する為コンテナも終了してしまいますが、この方法ならhttpdデーモンがフォアグランドで起動されてコンテナが終了しません。

実際に試してみる

httpd-foreground

まずは普通にapacheイメージを起動してみます

docker run -dit -p 8080:80 httpd:2.4

コンテナが起動しているか確認してみます

docker conteiner ls

コンテナを起動して時間がたってもコンテナは起動したままです。

service httpd start

次に先程のdocker run コマンドにservice httpd startコマンドを引数として渡してあげます。

docker run -dit -p 8080:80 httpd:2.4 service httpd start

コンテナを見てみます

COMMANDの欄がservice httpd startになっていてstatusがすぐにExitedになりました。serviceコマンドが終了したとほぼ同時にコンテナが停止しました。 

おまけ

-DFOREGROUNDオプションをつけずにhttpdコマンドのみでコンテナを起動してみます

docker run -dit -p 8080:80 httpd:2.4 httpd

こちらもすぐにコンテナが終了しています

何か間違いなどがありました遠慮なくご指摘ください。

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2