M1芯片MacBook构建Nginx+PHP的Laravel Docker镜像执行器失败
问题原因
- 架构适配问题:苹果M1芯片属于arm64架构,你选用的
ubuntu:16.04版本发布时间过早,官方arm64版本的软件源维护已经终止,大量系统依赖包无法正常拉取。Docker默认会拉取和宿主机架构匹配的镜像,因此执行apt-get相关操作时会找不到目标包。 - 软件源过期:你使用的
ppa:ondrej/php源已经在多年前停止对Ubuntu 16.04(代号Xenial)的版本支持,添加源后更新索引也无法找到PHP7.0相关的安装包,直接导致安装步骤失败返回退出码100。
修复方案
临时兼容方案(不推荐,性能损失大)
构建时强制指定x86_64架构,通过Docker的Rosetta模拟运行:
docker build --platform linux/amd64 -t your-image-name .
该方案不需要修改Dockerfile,但模拟运行会导致容器性能下降30%以上,仅适合临时验证使用。
长期适配方案(推荐)
修改Dockerfile替换更高版本的基础镜像和PHP版本,适配arm64架构:
- 将基础镜像替换为
ubuntu:22.04,该版本对arm64架构支持完善 - PHP版本升级到7.4或8.0+,目前主流Laravel版本均对高版本PHP做了兼容
- 调整PHP扩展包名适配新版本的包命名规则
修改后的Dockerfile参考:
FROM ubuntu:22.04 RUN apt-get update \ && apt-get install -y locales \ && locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 RUN apt-get update \ && apt-get install -y nginx curl zip unzip git software-properties-common supervisor \ && add-apt-repository -y ppa:ondrej/php \ && apt-get update \ && apt-get install -y php7.4-fpm php7.4-cli php7.4-mcrypt php7.4-gd php7.4-mysql \ php7.4-pgsql php7.4-imap php-memcached php7.4-mbstring php7.4-xml php7.4-curl \ php7.4-sqlite3 php7.4-xdebug \ && php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \ && mkdir /run/php \ && apt-get remove -y --purge software-properties-common \ && apt-get -y autoremove \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ && echo "daemon off;" >> /etc/nginx/nginx.conf RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log COPY default /etc/nginx/sites-available/default COPY php-fpm.conf /etc/php/7.4/fpm/php-fpm.conf EXPOSE 80 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf CMD ["/usr/bin/supervisord"]
修改后直接执行构建命令即可正常在M1设备上运行,无需架构模拟,性能无损失。
内容的提问来源于stack exchange,提问作者Aditya Banerjee
相关产品推荐
相关产品推荐

