Dockerfile中ubuntu:latest被忽略,容器用Debian,如何获取最新系统?
我想要创建一个PHP/Apache Docker容器,编写了如下的Dockerfile和docker-compose.yaml文件:
Dockerfile
FROM ubuntu:latest FROM php:5.4-apache RUN a2enmod ssl && a2enmod rewrite RUN apt-get update && apt-get upgrade -y --allow-unauthenticated RUN apt-get install software-properties-common -y --force-yes RUN apt-get update RUN apt-get install git libonig-dev libxml2-dev sqlite3 libsqlite3-dev curl libzip-dev libcurl4-openssl-dev zip unzip jq libldap2-dev net-tools libpng-dev -y --force-yes RUN docker-php-ext-install mysql mysqli gd RUN apt-get update EXPOSE 80 EXPOSE 443
docker-compose.yaml
version: '3.3' services: wawi_web_production: container_name: wawi_web_production build: context: ./apache dockerfile: Dockerfile volumes: - ./app:/var/www/html/ - ./apache/wawi.conf:/etc/apache2/sites-available/000-default.conf ports: - '8000:80' - '8080:443'
执行命令docker-compose up --build -d --force-recreate构建并启动容器后,进入容器执行lsb_release -a查看操作系统,结果显示为:
root@containerid:/var/www/html# lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 8.11 (jessie) Release: 8.11 Codename: jessie root@containerid:/var/www/html#
我期望容器使用最新版Ubuntu系统,请问我哪里操作错误?
问题原因
你Dockerfile里的多FROM指令是核心问题:Docker在构建镜像时,只会把最后一个FROM指令指定的镜像作为最终镜像的基础,前面的FROM ubuntu:latest会被完全忽略。而php:5.4-apache这个官方镜像的基础系统是Debian 8 Jessie,所以容器启动后显示的是Debian系统。
解决办法
方案1:基于Ubuntu手动构建(适配PHP5.4)
由于PHP5.4已经是非常老旧的版本,新版Ubuntu(20.04及以上)的官方源里已经没有这个版本的包,只能选择停止支持的旧版Ubuntu(比如14.04)来构建,示例Dockerfile如下:
FROM ubuntu:14.04 # 更新源并安装基础依赖 RUN apt-get update && apt-get upgrade -y # 安装Apache和PHP5.4相关组件 RUN apt-get install -y apache2 php5 php5-mysql php5-gd libapache2-mod-php5 # 启用需要的Apache模块 RUN a2enmod ssl && a2enmod rewrite # 安装你需要的其他工具和依赖 RUN apt-get install -y git libxml2-dev sqlite3 libsqlite3-dev curl zip unzip jq libldap2-dev net-tools libpng-dev # 暴露端口 EXPOSE 80 443
注意:Ubuntu 14.04已经停止官方支持,存在安全风险,如果业务允许,建议优先升级PHP版本。
方案2:升级PHP版本,使用基于Ubuntu的官方PHP镜像
如果可以升级PHP到7.4及以上的支持版本,可以选择官方提供的基于Ubuntu的PHP-Apache镜像,比如php:8.2-apache-22.04(基于Ubuntu 22.04),修改后的Dockerfile示例:
FROM php:8.2-apache-22.04 # 启用Apache模块 RUN a2enmod ssl && a2enmod rewrite # 安装依赖和PHP扩展 RUN apt-get update && apt-get install -y git libonig-dev libxml2-dev sqlite3 libsqlite3-dev curl libzip-dev libcurl4-openssl-dev zip unzip jq libldap2-dev net-tools libpng-dev RUN docker-php-ext-install mysqli gd pdo_mysql zip # 暴露端口 EXPOSE 80 443
这种方式既可以使用Ubuntu系统,又能获得官方维护的PHP和Apache环境,安全性和稳定性更有保障。
内容的提问来源于stack exchange,提问作者Doğan Uçar

