この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と一緒に実行するにはどうすればよいですか?
いくつかのサービスを起動するには、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つの開始点から複数のサービスの開始を管理する最良の方法はスーパーバイザーです。
ここでは、監督者に関するドッカーの公式ドキュメントを見つけることができます
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)
最近似たようなものが必要でした。 AlpineLinuxイメージの場合、php-fpm
とWebサーバーの両方をコンテナコマンドとして実行するだけで十分です。 Dockerfile
で次のように定義されます。
CMD /usr/bin/php-fpm -D; nginx
すなわち。 php-fpm
をデーモン化し、フォアグラウンドでnginx
を実行します。
ubuntu/debianイメージでは、Dockerfile
RUN
コマンドを実行して、最近インストールしたパッケージを 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の質問
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秒ごとに追加します。これにより、実行時と停止時がわかります。
上記の@ckeeneyの答えは正しい答えとして受け入れられると思いますが、特定のケースでそれを機能させることができませんでした。
Dumb-initを介してPID1をプロキシし、次のコマンドでPHP-FPMをデーモン化することができました:dumb-init /usr/sbin/php-fpm7.2 -F -R
https://engineeringblog.Yelp.com/2016/01/dumb-init-an-init-for-docker.html