web-dev-qa-db-ja.com

デフォルトでDockerコンテナでphp-fpmを起動するにはどうすればよいですか?

このDockerイメージがあります-

FROM centos:7
MAINTAINER Me <me.me>
RUN yum update -y
RUN yum install -y git https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

RUN yum install -y ansible
RUN git clone https://github.com/.../dockerAnsible.git
RUN ansible-playbook dockerFileBootstrap.yml
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

VOLUME [ "/sys/fs/cgroup" ]
EXPOSE 80 443 3306

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

基本的に、Dockerコンテナの起動時にphp-fpmが起動するようにします。手動でコンテナに移動して/usr/sbin/php-fpmで有効にすると、php-fpmが動作します。

このコマンドを使用して、ansibleファイル内で試してみました(動作しませんでした)。サービスモジュールも使用してみましたが、うまくいきませんでした。

 - name: Start php fpm
   command: /usr/sbin/php-fpm

Php-fpmをApacheと一緒に実行するにはどうすればよいですか?

12
J. Doe

いくつかのサービスを起動するには、supervisorを使用する必要があります

Dockerfileにスーパバイザをインストールしてから起動します

COPY ./docker/supervisord.conf /etc/supervisord.conf
....
CMD ["/usr/bin/supervisord", "-n"]

そしてあなたの docker/supervisord.confには、開始したいすべてのサービスが含まれているため、そのようなサービスを利用できます

[program:php-fpm]
  command=/opt/remi/php70/root/usr/sbin/php-fpm -c /etc/php-fpm.conf
  ;command=/usr/sbin/php70-fpm -c /etc/php-fpm.d
  stdout_logfile=/dev/stdout
  stdout_logfile_maxbytes=0
  stderr_logfile=/dev/stderr
  stderr_logfile_maxbytes=0

[program:nginx]
  command=/usr/sbin/nginx
  stdout_logfile=/dev/stdout
  stdout_logfile_maxbytes=0
  stderr_logfile=/dev/stderr
  stderr_logfile_maxbytes=0

もちろん、パスとphp-fpmバージョンとサービス(私の例ではnginx、Apache for youなど)に適応する必要がありますが、基本的には1つの開始点から複数のサービスの開始を管理する最良の方法はスーパーバイザーです。

ここでは、監督者に関するドッカーの公式ドキュメントを見つけることができます

https://docs.docker.com/engine/admin/using_supervisord/

10
olibiaz

php-fpmをフォアグラウンドで実行して、DockerコンテナーでPID 1にする方法を探してここに来ました。解決策は

php-fpm -F -R

説明

php-fpm --helpで利用可能なオプションを確認できます

-F, --nodaemonize 
      force to stay in foreground, and ignore daemonize option from config file

Dockerコンテナでphp-fpmを実行している場合、プロセスをルートとして実行している可能性が高くなります。 php-fpmは、追加のフラグがないとルートとして起動しません。

  -R, --allow-to-run-as-root
        Allow pool to run as root (disabled by default)
8
ckeeney

最近似たようなものが必要でした。 AlpineLinuxイメージの場合、php-fpmとWebサーバーの両方をコンテナコマンドとして実行するだけで十分です。 Dockerfileで次のように定義されます。

CMD /usr/bin/php-fpm -D; nginx

すなわち。 php-fpmをデーモン化し、フォアグラウンドでnginxを実行します。

ubuntu/debianイメージでは、DockerfileRUNコマンドを実行して、最近インストールしたパッケージを allow 開始する必要もあります。このような:

RUN echo "exit 0" > /usr/sbin/policy-rc.d

その後、CMDコマンド内でphp-fpmを再起動します

CMD /etc/init.d/php7.0-fpm restart && nginx -g "daemon off;"

policy-rc.dの詳細 このaskubuntuの質問

7
helvete

Rc.localを使用してコンテナー内のサービスを開始し、そのコンテナー内でコマンドを実行してrc.localを実行します。サンプルの実行コマンドは次のとおりです。

Sudo docker run --restart=always -itd --name mycontainer -p 80:80 -p 443:443 myimage/name /bin/bash -c "/etc/rc.local && while true; do echo hello world; sleep 100; done"

そして、これは/ etcのrc.localファイルの1つです

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sleep 5
service mysql start
sleep 5
service php5-fpm start
sleep 5
service nginx start
exit 0

これが行うことは、ポート80および443が公開されたイメージ「myimage/name」を使用して「mycontainer」と呼ばれるコンテナーを起動することです。起動すると、mysql、php5-fpm、nginxを呼び出して起動し、それぞれの間で5秒間停止します。この方法で、任意のサービスを呼び出して、そのコンテナ内で実行するサービスを開始できます。ただし、これらのサービス用に開いているポートを忘れずに追加してください。

また、この実行コマンドは、「Hello World」を「Pulse」としてログファイルに100秒ごとに追加します。これにより、実行時と停止時がわかります。

1
Gavin Tremlor

上記の@ckeeneyの答えは正しい答えとして受け入れられると思いますが、特定のケースでそれを機能させることができませんでした。

dumb-initを使用

Dumb-initを介してPID1をプロキシし、次のコマンドでPHP-FPMをデーモン化することができました:dumb-init /usr/sbin/php-fpm7.2 -F -Rhttps://engineeringblog.Yelp.com/2016/01/dumb-init-an-init-for-docker.html

0
bxbxckx