You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Docker恢复PHP5.6旧网站:MySQL驱动安装故障求助

搭建PHP5.6 Docker环境时MySQL驱动安装失败问题

我正在恢复一个使用PHP5.6和mysql_connect的旧网站,计划先搭建Docker环境确保功能正常后再更新代码,但安装MySQL驱动时遇到了困难。

当前docker-compose.yml配置

version: '3'

services:
  db:
    image: mysql:5.5
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "edited for privacy"
      MYSQL_DATABASE: "edited for privacy"
      MYSQL_USER: "edited for privacy"
      MYSQL_PASSWORD: "edited for privacy"

  php:
    depends_on:
      - db
    build: .
    volumes:
      - ./:/var/www/html
    ports:
      - "8000:80"
    restart: always

volumes:
  db_data: {}

第一次尝试的Dockerfile及错误

Dockerfile内容

FROM php:5.6-apache

RUN apt-get install mysql-server mysql-client php5-mysql

RUN a2enmod rewrite

构建错误

docker compose up -d
[+] Building 1.2s (6/7)
 => [internal] load build definition from Dockerfile                                                                                                                                                                                   0.0s
 => => transferring dockerfile: 139B                                                                                                                                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/php:5.6-apache                                                                                                                                                                      0.8s
 => [auth] library/php:pull token for registry-1.docker.io                                                                                                                                                                             0.0s
 => CACHED [1/3] FROM docker.io/library/php:5.6-apache@sha256:0a40fd273961b99d8afe69a61a68c73c04bc0caa9de384d3b2dd9e7986eec86d                                                                                                         0.0s
 => => resolve docker.io/library/php:5.6-apache@sha256:0a40fd273961b99d8afe69a61a68c73c04bc0caa9de384d3b2dd9e7986eec86d                                                                                                                0.0s
 => ERROR [2/3] RUN apt-get install mysql-server mysql-client php5-mysql                                                                                                                                                               0.3s
------
 > [2/3] RUN apt-get install mysql-server mysql-client php5-mysql:
#0 0.292 Reading package lists...
#0 0.296 Building dependency tree...
#0 0.296 Reading state information...
#0 0.297 E: Unable to locate package mysql-server
#0 0.297 E: Unable to locate package mysql-client
#0 0.297 E: Unable to locate package php5-mysql
------
failed to solve: executor failed running [/bin/sh -c apt-get install mysql-server mysql-client php5-mysql]: exit code: 100

第二次修改后的Dockerfile及错误

修改后的Dockerfile内容

FROM php:5.6-apache

RUN apt-get update && apt-get install -y \
    mysql-client \
    mysql-server \
    php5-mysql

RUN a2enmod rewrite

构建错误(注:实际执行命令误加了su)

docker compose up -d
[+] Building 0.7s (5/6)
 => [internal] load build definition from Dockerfile                                                                                                                                                                                   0.0s
 => => transferring dockerfile: 189B                                                                                                                                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/php:5.6-apache                                                                                                                                                                      0.4s
 => CACHED [1/3] FROM docker.io/library/php:5.6-apache@sha256:0a40fd273961b99d8afe69a61a68c73c04bc0caa9de384d3b2dd9e7986eec86d                                                                                                         0.0s
 => => resolve docker.io/library/php:5.6-apache@sha256:0a40fd273961b99d8afe69a61a68c73c04bc0caa9de384d3b2dd9e7986eec86d                                                                                                                0.0s
 => ERROR [2/3] RUN su apt-get update -q && apt-get install -y     mysql-client     mysql-server     php5-mysql                                                                                                                        0.3s
------
 > [2/3] RUN su apt-get update -q && apt-get install -y     mysql-client     mysql-server     php5-mysql:
#0 0.281 su: invalid option -- 'q'
#0 0.281 Usage: su [options] [LOGIN]
#0 0.281
#0 0.281 Options:
#0 0.281   -c, --command COMMAND         pass COMMAND to the invoked shell
#0 0.281   -h, --help                    display this help message and exit
#0 0.281   -, -l, --login                make the shell a login shell
#0 0.281   -m, -p,
#0 0.281   --preserve-environment        do not reset environment variables, and
#0 0.281                                 keep the same shell
#0 0.281   -s, --shell SHELL             use SHELL instead of the default in passwd
#0 0.281
------
failed to solve: executor failed running [/bin/sh -c su apt-get update -q && apt-get install -y     mysql-client     mysql-server     php5-mysql]: exit code: 2

解决方案

问题根源在于几个配置错误,修正后的Dockerfile如下:

FROM php:5.6-apache

# 更新Debian Jessie归档源(官方源已迁移)
RUN echo "deb http://deb.debian.org/debian jessie main" > /etc/apt/sources.list && \
    echo "deb http://deb.debian.org/debian jessie-updates main" >> /etc/apt/sources.list && \
    echo "deb http://security.debian.org jessie/updates main" >> /etc/apt/sources.list

# 安装mysql客户端及编译依赖
RUN apt-get update && apt-get install -y \
    mysql-client \
    libmysqlclient-dev \
    && rm -rf /var/lib/apt/lists/*

# 安装PHP原生mysql扩展(支持mysql_connect函数)
RUN docker-php-ext-install mysql

# 启用Apache rewrite模块
RUN a2enmod rewrite

关键修正点

  1. 替换源地址:PHP5.6镜像基于Debian Jessie,默认源已归档,需更换为oldstable地址才能找到包。
  2. 移除mysql-server:数据库服务由db容器单独提供,PHP容器只需客户端工具。
  3. 正确安装PHP扩展:使用官方镜像提供的docker-php-ext-install命令安装mysql扩展,而非apt包,这是PHP5.6支持mysql_connect的正确方式。
  4. 删除多余su命令:官方PHP镜像默认以root运行,无需su执行命令。

内容的提问来源于stack exchange,提问作者Orange Lux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:45:54