如何在 Docker 容器中为 PHP 安装 mod_rewrite 模块?

Тим*_*ров 5 php apache docker

docker-compose.yml

version: "3.7"
services:

  php:
    build: './php/'
    volumes:
      - ./public_html/www/:/var/www/html/

  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    ports:
      - "8080:80"
    volumes:
      - ./public_html/www/:/var/www/html/
      #- ./log:/var/log/apache2

  mysql:
    image: mysql:5.6.40
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=el-cigarette
      - MYSQL_ROOT_PASSWORD=root

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
      - '8081:80'
Run Code Online (Sandbox Code Playgroud)

php/Dockerfile

FROM php:7.0-apache
MAINTAINER Webgriffe Srl <support@webgriffe.com>
RUN docker-php-ext-install mysqli && a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

apache/demo.apache.conf

ServerName localhost

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so



<VirtualHost *:80>
    # Proxy .php requests to port 9000 of the php-fpm container
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    DocumentRoot /var/www/html/

    DirectoryIndex index.php

    <Directory /var/www/html/>
        Options All
            AllowOverride All
        Order allow,deny
        Allow from all
            Require all granted
    </Directory>
    
    # Send apache logs to stdout and stderr
    CustomLog /var/www/1 common
    ErrorLog /var/www/2
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

我输入了下一个命令

docker-compose build
docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

我得到那个输出

Creating docker-local2_mysql_1 ... done
Creating docker-local2_php_1        ... done
Creating docker-local2_phpmyadmin_1 ... done
Creating docker-local2_apache_1     ... done
Run Code Online (Sandbox Code Playgroud)

进一步我写这个

docker exec -it docker-local2_php_1 sh
# php -m
Run Code Online (Sandbox Code Playgroud)

但是我没有看到 mod_rewrite 模块

[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]
Run Code Online (Sandbox Code Playgroud)

我的 .htaccess 文件不起作用 我哪里出错了?我需要做什么来解决这个问题?

dan*_*alk 7

正如评论中提到的,mod_rewrite不是 PHP 模块,而是 apache 模块。您已经在 php/Dockerfile 中启用了它:

a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

不需要额外的软件包安装。通过运行apachectl -M列出所有启用的模块来验证模块是否已启用,您应该看到如下内容:

...
rewrite_module (shared)
...
Run Code Online (Sandbox Code Playgroud)

关于您的 docker compose 文件,您似乎正在使用两个单独的容器来运行您的 Web 服务,而实际上您只需要一个(除非您使用第二个 apache 容器将请求反向代理到 PHP-apache 容器)。在简单的情况下,PHP 和 apache 已预先配置为在php:<version>-apache映像中协同工作(例如 mod_php 预安装),您只需将您的文件复制demo.apache.conf为 php 构建的一部分,例如:

a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

最后提示,避免使用links关键字,它们已被弃用。默认情况下,Docker compose 将为您创建一个网络,其中所有容器都可以使用服务名称作为主机名相互解析。