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

J. *_*Doe 12 php ansible docker

我有这个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"]
Run Code Online (Sandbox Code Playgroud)

基本上,我想要它,以便在docker容器启动时启动php-fpm.我有php-fpm工作,如果我手动进入容器并打开它/usr/sbin/php-fpm.

我用这个命令在我的ansible文件中尝试了它(它没有用).我也试过使用服务模块而没有运气.-

 - name: Start php fpm
   command: /usr/sbin/php-fpm
Run Code Online (Sandbox Code Playgroud)

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

oli*_*iaz 12

您应该使用supervisor以启动多个服务

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

COPY ./docker/supervisord.conf /etc/supervisord.conf
....
CMD ["/usr/bin/supervisord", "-n"]
Run Code Online (Sandbox Code Playgroud)

而且你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
Run Code Online (Sandbox Code Playgroud)

当然你应该适应你的路径和php-fpm版本和你的服务(我的例子中的nginx,apache等等),但基本上supervisor是从一个起点管理几个服务的开始的最佳方式.

在这里你可以找到关于主管的码头工人的官方文件

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

  • 尽管此方法似乎可行,但似乎对我需要启动的一项额外服务来说有点过头了。是否可以执行将我的CMD链接在一起的操作,或者在初始化Docker容器时启动它? (2认同)
  • 我真的不觉得这种方法有点矫枉过正,supervisor 是处理多处理器管理的常用方法,也是 docker 推荐的方法,它只是你的 docker 文件会稍微改变一点和一个更多的配置文件。如果您想稍后添加一些服务,您的容器将更加灵活。但是,如果您找到更简单的“合法”方法,请告诉我们,我很感兴趣 (2认同)

cke*_*ney 9

我来到这里寻找如何php-fpm在前台运行,因此它可能是一个docker容器中的PID 1.解决方案是

php-fpm -F -R
Run Code Online (Sandbox Code Playgroud)

说明

我们可以查看可用的选项 php-fpm --help

-F, --nodaemonize 
      force to stay in foreground, and ignore daemonize option from config file
Run Code Online (Sandbox Code Playgroud)

如果您php-fpm在docker容器中运行,则很有可能以root身份运行该进程.如果没有额外的标志,php-fpm将不会以root身份启动:

  -R, --allow-to-run-as-root
        Allow pool to run as root (disabled by default)
Run Code Online (Sandbox Code Playgroud)

  • 你好,以 root 身份运行 php-fpm 安全吗?我担心 (3认同)
  • 这个答案仅适用于在容器化环境中运行 php-fpm。如果您不使用 docker 或其他容器,以 root 身份运行 php-fpm 会大大增加您遭受黑客攻击的风险。 (2认同)
  • 此命令在 Dockerfile 中不起作用,这是此答案的用例。 (2认同)

hel*_*ete 7

我最近需要类似的东西.对于alpine linux映像,它足以运行它们php-fpm和web服务器作为容器命令.定义Dockerfile有点像这样:

CMD /usr/bin/php-fpm -D; nginx
Run Code Online (Sandbox Code Playgroud)

即.守护进程php-fpm然后nginx在前台运行.

Ubuntu的/ Debian的图像也有必要允许通过运行启动最近安装的程序包Dockerfile RUN这样的命令:

RUN echo "exit 0" > /usr/sbin/policy-rc.d
Run Code Online (Sandbox Code Playgroud)

然后php-fpmCMD命令中重新启动

CMD /etc/init.d/php7.0-fpm restart && nginx -g "daemon off;"
Run Code Online (Sandbox Code Playgroud)

更多关于policy-rc.d被发现在这个askubuntu问题