在创建容器后,PHP-fpm不启动

y0u0uwnf  于 2022-09-19  发布在  PHP
关注(0)|答案(3)|浏览(361)

我做了一个Dockerfile,但当我运行它并进入容器时,php8.0-fpm服务没有运行

如何使其在构建时运行?请注意,我在Docker文件中运行了命令service php8.0-fpm start,但即使这样它也不会运行。

我应该怎么做才能让php8.0-fpm服务与容器一起启动?

下面是我制作的Dockerfile:

FROM ubuntu:jammy

ENV DEBIAN_FRONTEND=noninteractive

# Instalação Apache e PHP

RUN apt-get update && 
    apt-get install software-properties-common -y && 
    add-apt-repository ppa:ondrej/php -y && 
    apt-get update && 
    apt-get install -y 
    apache2 
    libapache2-mod-php8.0 
    libapache2-mod-php 
    php8.0-fpm 
    libapache2-mod-fcgid 

# Alteração sequência index

COPY /src/dir.conf /etc/apache2/mods-enabled

# Commitando a nova configuração

RUN service apache2 restart
RUN service php8.0-fpm restart

# Inserindo página info.php

COPY /src/info.php /var/www/html

# Alterando módulos de multiprocessamento

RUN service apache2 stop && 
    a2dismod php8.0 && 
    a2dismod php8.1 && 
    a2dismod mpm_prefork && 
    a2enmod mpm_event && 
    a2enconf php8.0-fpm && 
    a2enmod proxy && 
    a2enmod proxy_fcgi && 
    service apache2 restart && 
    service php8.0-fpm start

# Entrypoint para o conteiner iniciar o Apache

ENTRYPOINT ["apache2ctl", "-D", "FOREGROUND"]```
v7pvogib

v7pvogib1#

Docker容器只运行一个进程。它本身并不“运行服务”。映像构建也不保留任何正在运行的进程。当您启动容器时,映像的ENTRYPOINTCMD将是容器中唯一运行的内容。

避免技术原因,我会大致建议像servicesystemctl这样的命令在Docker中不起作用。例如,RUN service php8.0-fpm restart什么也不做:在这个命令之前,php-fpm没有运行,在RUN命令之后,它也不会运行。

您通常会将其重新构造为多个单独的容器,并使用诸如Docker Compose之类的工具将它们全部运行在一起。Docker有几个official sample applications可以证明这一点。基于编写的设置可能如下所示


# docker-compose.yaml

version: '3.8'
services:
  php:
    build: .  # using default Dockerfile
  apache:
    build:
      context: .
      dockerfile: Dockerfile.apache
    ports:
      - '8000:80'

您的Dockerfile将以FROM php:8.0-fpm开头,并且只包含与PHP相关的设置;Dockerfile.apache将以FROM httpd:2.4开头,并且只复制静态资产和Apache配置。您的代理设置需要使用名称ProxyPass "/" "fcgi://php:9000"引用另一个容器;有关其他详细信息,请参阅Docker文档中的Networking in Compose

请注意,即使在这种情况下,像docker-compose exec apache service apache2 status这样的代码仍然不会显示“服务正在运行”,但如果您使用docker-compose exec apache ps -e,您将看到容器中的HTTP守护进程是进程1。这是正常的。

igsr9ssn

igsr9ssn2#

我设法将它放在一个容器中,PHP有一个名为Supervisor的扩展,安装了它后,我们能够在容器中启动两个或更多服务。

文档文件如下所示:

FROM httpd:2.4-alpine

RUN apk update && 
    apk add 
    php 
    php-fpm 
    php-zip 
    composer 
    supervisor

COPY . /usr/local/apache2/htdocs
COPY httpd.conf /usr/local/apache2/conf/httpd.conf
COPY supervisor /etc/supervisor

WORKDIR /usr/local/apache2/htdocs

CMD ["supervisord","-n", "-c", "/etc/supervisor/supervisord.conf"]

我为Supervisor创建了两个配置文件。

apache.conf

[program:apache]
command=httpd -DFOREGROUND
autostart=true
autorestart=true
priority=10
startretries=1
startsecs=1
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

fpm.conf

[program:php-fpm]
command = php-fpm8 --nodaemonize 
autostart=true
autorestart=true
priority=5
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

就这样,这两个服务启动了,并且运行得很完美!

oyxsuwqo

oyxsuwqo3#

您需要在启动时运行php fpm。如果你在你的vm操作系统上安装了bash,你可以这样做。

入门标志

Cmd[“/bin/bash”,“-c”,“php-fpm8&&Include Your Apache here”]

完整指南:How to setup PHP 8, NGINX and PHP-FPM with docker

相关问题