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环境不同。具体修复步骤:
- 合并安装命令到同一层,强制刷新环境变量:把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" - 明确指定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 - 合并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/* - 强制重建镜像:执行以下命令清理旧缓存并重新构建:
docker-compose build --no-cache docker-compose up -d
- 合并安装命令到同一层,强制刷新环境变量:把nodejs安装、依赖安装、yarn安装合并到同一个RUN指令,避免分层缓存导致的路径问题,同时手动指定环境变量路径。修改相关代码块为:
内容的提问来源于stack exchange,提问作者Mariano Alesandro
相关产品推荐
相关产品推荐

