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

M1芯片Mac构建phpdockerio/php73-fpm Docker镜像时出错求助

问题描述

在M1芯片Mac上构建Docker镜像时,执行到RUN npm install -global yarn步骤出现错误:

rpc error: code = Unknown desc = process "/bin/sh -c npm install -global yarn" did not complete successfully: exit code: 127

注释该行后,后续执行pear/pecl相关命令时仍弹出相同错误信息。使用的Dockerfile如下:

FROM --platform=linux/arm64 phpdockerio/php73-fpm:latest

# Install nodeJS
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -

# Install selected extensions and other stuff
RUN export DEBIAN_FRONTEND=noninteractive && \
    apt-get update && apt-get -y --no-install-recommends install \
    supervisor \
    cron \
    git \
    ssh \
    nano \
    zip \
    php7.3-mysql \
    php7.3-mbstring \
    php7.3-gd \
    php7.3-soap \
    php7.3-dev \
    php7.3-pdo \
    curl \
    php-pear \
    nodejs \
    apt-transport-https \
    && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
RUN npm install -global yarn

# Install Composer
RUN cd /usr/src
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer --version=1.10.16


# Install MSSQL extention
RUN apt-get update && apt-get install -qy apt-transport-https
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update
#RUN ACCEPT_EULA=Y apt-get -y install msodbcsql17 mssql-tools g++ unixodbc-dev make
RUN ACCEPT_EULA=Y apt-get -y install openssl mssql-tools g++ unixodbc-dev make
RUN apt-get update -yqq \
    && apt-get install -y --no-install-recommends openssl \
    && sed -i 's,^\(MinProtocol[ ]*=\).*,\1'TLSv1.0',g' /etc/ssl/openssl.cnf \
    && sed -i 's,^\(CipherString[ ]*=\).*,\1'DEFAULT@SECLEVEL=1',g' /etc/ssl/openssl.cnf
RUN pear config-set php_ini `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"` system
RUN pecl channel-update pecl.php.net
RUN pecl install sqlsrv-5.9.0
RUN pecl install pdo_sqlsrv-5.9.0

RUN printf "; priority=30\nextension=pdo\n" > /etc/php/7.3/fpm/conf.d/30-pdo.ini
RUN printf "; priority=40\nextension=sqlsrv.so\n" > /etc/php/7.3/fpm/conf.d/40-sqlsrv.ini
RUN printf "; priority=50\nextension=pdo_sqlsrv.so\n" > /etc/php/7.3/fpm/conf.d/50-pdo_sqlsrv.ini

RUN printf "; priority=30\nextension=pdo\n" > /etc/php/7.3/cli/conf.d/30-pdo.ini
RUN printf "; priority=40\nextension=sqlsrv.so\n" > /etc/php/7.3/cli/conf.d/40-sqlsrv.ini
RUN printf "; priority=50\nextension=pdo_sqlsrv.so\n" > /etc/php/7.3/cli/conf.d/50-pdo_sqlsrv.ini

## Fixed locals for MSSQL extention
RUN apt-get install -y locales
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
RUN locale-gen


# Setup supervisor
RUN mkdir -p /var/log/supervisor
ADD .docker/php/crontab /etc/cron.d/laravel
ADD .docker/php/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
ADD .docker/php/php.ini /etc/php/7.3/fpm/php.ini

WORKDIR /var/www
解决方法
  • 问题根源:exit code 127表示系统找不到指定命令,这里是因为npm/pear/pecl的路径未加入环境变量,或者Docker分层构建导致缓存失效,容器无法识别新安装的命令;再加上M1的arm64架构特性,部分工具的默认安装路径可能与x86环境不同。

  • 具体修复步骤:

    1. 合并安装命令到同一层,强制刷新环境变量:把nodejs安装、依赖安装、yarn安装合并到同一个RUN指令,避免分层缓存导致的路径问题,同时手动指定环境变量路径。修改相关代码块为:
      # Install nodeJS, dependencies and yarn
      RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - && \
          export DEBIAN_FRONTEND=noninteractive && \
          apt-get update && apt-get -y --no-install-recommends install \
          supervisor \
          cron \
          git \
          ssh \
          nano \
          zip \
          php7.3-mysql \
          php7.3-mbstring \
          php7.3-gd \
          php7.3-soap \
          php7.3-dev \
          php7.3-pdo \
          curl \
          php-pear \
          nodejs \
          apt-transport-https \
          && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* && \
          npm install -g yarn && \
          export PATH="$PATH:/usr/local/bin:/usr/bin"
      
    2. 明确指定pear/pecl的绝对路径:避免环境变量问题导致的命令找不到,修改pear相关命令为:
      RUN /usr/bin/pear config-set php_ini `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"` system
      RUN /usr/bin/pecl channel-update pecl.php.net
      RUN /usr/bin/pecl install sqlsrv-5.9.0
      RUN /usr/bin/pecl install pdo_sqlsrv-5.9.0
      
    3. 合并MSSQL扩展安装命令,清理无效缓存:之前的apt-get clean已清空缓存,将MSSQL相关安装指令合并,减少分层并确保源有效:
      # Install MSSQL extension
      RUN export DEBIAN_FRONTEND=noninteractive && \
          curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
          curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
          apt-get update && \
          ACCEPT_EULA=Y apt-get -y install openssl mssql-tools g++ unixodbc-dev make && \
          sed -i 's,^\(MinProtocol[ ]*=\).*,\1TLSv1.0,g' /etc/ssl/openssl.cnf && \
          sed -i 's,^\(CipherString[ ]*=\).*,\1DEFAULT@SECLEVEL=1,g' /etc/ssl/openssl.cnf && \
          apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
      
    4. 强制重建镜像:执行以下命令清理旧缓存并重新构建:
      docker-compose build --no-cache
      docker-compose up -d
      

内容的提问来源于stack exchange,提问作者Mariano Alesandro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:20:18