如何在默认情况下在Docker容器中启动php-fpm?

时间:2016-05-19 04:04:49

标签: php docker ansible

我有这个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。我有php-fpm工作,如果我手动进入容器并用/usr/sbin/php-fpm打开它。

我使用此命令在我的ansible文件中尝试了它(它没有工作)。我尝试使用服务模块也没有运气.-

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

如何让php-fpm与apache一起运行?

6 个答案:

答案 0 :(得分:10)

您应该使用supervisor来启动多项服务

在您的dockerfile中,安装supervisor,然后启动

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为你等等),但基本上supervisor是从一个管理几个服务的开始的最佳方式起点。

在这里您可以找到有关主管的码头工人的正式文件

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

答案 1 :(得分:6)

我最近需要类似的东西。对于 alpine linux映像,只需运行php-fpm和Web服务器作为容器命令即可。在Dockerfile中定义的有点像这样:

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

即。守护php-fpm,然后在前台运行nginx

ubuntu / debian 映像上,还需要允许通过运行Dockerfile RUN命令来启动最近安装的软件包:< / p>

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

然后在php-fpm命令

中重新启动CMD
CMD /etc/init.d/php7.0-fpm restart && nginx -g "daemon off;"

有关policy-rc.d的更多信息in this askubuntu question

答案 2 :(得分:6)

我来到这里寻找如何在前台运行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,则很有可能以root身份运行该进程。如果没有额外的标志,php-fpm将不会以root身份启动:

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

答案 3 :(得分:3)

如果您想在同一个容器中运行 php-fpmApache(通常使用 MPM 事件),您可能会发现此配置很有用:

[supervisord]

[program:php-fpm]
command=php-fpm -F -R
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:apachectl]
command=apachectl -D "FOREGROUND" -k start
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

答案 4 :(得分:1)

我使用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文件之一
#!/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

这样做是为了启动一个名为&#34; mycontainer&#34;使用图像&#34; myimage / name&#34;端口80和443暴露在外。一旦启动它就会调用mysql,php5-fpm和nginx来启动,在每个之间暂停5秒钟。通过这种方式,您可以调用任何要在该容器内运行的服务。请记住为这些服务添加开放端口。

此运行命令还将附加&#34; Hello World&#34;作为&#34;脉冲&#34;每隔100秒进入您的日志文件这会让你知道它何时运行以及何时停止。

答案 5 :(得分:0)

我相信@ ckeeney上面的答案可以被接受为正确的答案,但我无法让它与我的特定情况一起工作。

使用dumb-init

我已经能够通过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