基于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
关键修正点
- 替换源地址:PHP5.6镜像基于Debian Jessie,默认源已归档,需更换为oldstable地址才能找到包。
- 移除mysql-server:数据库服务由
db容器单独提供,PHP容器只需客户端工具。 - 正确安装PHP扩展:使用官方镜像提供的
docker-php-ext-install命令安装mysql扩展,而非apt包,这是PHP5.6支持mysql_connect的正确方式。 - 删除多余su命令:官方PHP镜像默认以root运行,无需su执行命令。
内容的提问来源于stack exchange,提问作者Orange Lux
相关产品推荐
相关产品推荐

