我制作了一个 Dockerfile,但是当我运行它并进入容器时,php8.0-fpm 服务未运行。
如何让它在构建时运行?请注意,我在 Dockerfile 中运行了命令
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"]```
我设法将其保留在一个容器中,PHP 有一个名为 Supervisor 的扩展,安装后我们能够在容器内启动两个或多个服务。
Dockerfile 看起来像这样:
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
至此,两项服务启动并且运行完美!
您需要在启动时运行 php fpm。如果你的虚拟机操作系统中安装了bash,你可以这样做。
STOPSIGNAL SIGTERM
CMD ["/bin/bash", "-c", "php-fpm8 && include your apache here"]
Docker 容器仅运行单个进程。它本身并不“运行服务”。映像构建也不保留任何正在运行的进程。当您启动容器时,图像的 ENTRYPOINT
或
CMD
是容器中唯一运行的东西。为了避免技术原因,我广泛建议像 service
或
systemctl
这样的命令在 Docker 中不起作用。例如,RUN service php8.0-fpm restart
不执行任何操作:在此命令之前 PHP-FPM 未运行,在 RUN
命令之后它也不会运行。您通常会将其重组为多个单独的容器,使用 Docker Compose 等工具将它们全部运行在一起。 Docker 有几个“官方示例应用程序”来演示这一点。基于 Compose 的设置可能看起来像
# 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 文档中的Compose 中的网络。请注意,即使在这种情况下,类似
docker-compose exec apache service apache2 status
之类的内容仍然不会显示“服务正在运行”,但如果您 docker-compose exec apache ps -e
您会在容器内看到 HTTP 守护进程为进程 1。这是正常现象。