构建Docker容器时出现‘Error executing command’错误如何解决?
问题描述
执行docker-compose build时遇到以下错误:
#0 3.997 ## Installing packages required for setup: lsb-release gnupg... #0 3.997 + apt-get install -y lsb-release gnupg > /dev/null 2>&1 #0 12.91 Error executing command, exiting ------ failed to solve: executor failed running [/bin/sh -c curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && apt-get install -y nodejs]: exit code: 1
对应的Dockerfile如下:
FROM php:8.2-fpm RUN apt-get update && apt-get install -y \ apt-utils\ libpq-dev\ libpng-dev\ libzip-dev\ libjpeg-dev\ zip unzip \ git && \ docker-php-ext-install pdo_mysql && \ docker-php-ext-configure gd --with-jpeg && \ docker-php-ext-install -j$(nproc) gd zip && \ docker-php-ext-install bcmath && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* COPY ./.docker/app/php.ini /usr/local/etc/php/conf.d/php.ini COPY app /var/www/app COPY bootstrap /var/www/bootstrap COPY config /var/www/config COPY database /var/www/database COPY public /var/www/public COPY resources /var/www/resources COPY routes /var/www/routes COPY storage /var/www/storage COPY artisan /var/www/artisan COPY package.json /var/www/package.json COPY vite.config.js /var/www/vite.config.js COPY composer.* ./ RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ apt-get install -y nodejs RUN npm install -g npm ENV COMPOSER_ALLOW_SUPERUSER=1 RUN curl -sS https://getcomposer.org/installer | php -- \ --filename=composer \ --install-dir=/usr/local/bin RUN composer install \ --no-interaction \ --no-plugins\ --no-suggest \ --no-scripts \ --no-autoloader \ --prefer-dist RUN composer dump-autoload --no-scripts --optimize && \ chown -R root:www-data /var/www && \ chmod 755 -R /var/www && \ chmod -R 775 /var/www/storage && \ chmod -R 775 /var/www/bootstrap/cache WORKDIR /var/www
已尝试更换Node.js版本、清理缓存重建容器、手动安装gnupg,但问题依旧。
解决方案
错误核心原因:
- 第一次
RUN指令结尾执行了apt-get clean && rm -rf /var/lib/apt/lists/*,清空了APT源缓存列表,后续执行apt-get install时无可用源数据,导致安装依赖失败。 - NodeSource脚本默认重定向输出到
/dev/null,屏蔽了具体错误信息,无法排查细节。
针对问题,提供两种调整方案:
方案1:将Node.js安装整合到第一次APT操作阶段
把Node.js安装步骤移到第一次apt-get操作中,避免重复清理缓存,同时提前安装脚本所需依赖:
FROM php:8.2-fpm # 先安装所有基础依赖,包括Node.js脚本需要的lsb-release、gnupg、curl RUN apt-get update && apt-get install -y \ apt-utils\ libpq-dev\ libpng-dev\ libzip-dev\ libjpeg-dev\ zip unzip \ git \ lsb-release \ gnupg \ curl && \ # 安装PHP扩展 docker-php-ext-install pdo_mysql && \ docker-php-ext-configure gd --with-jpeg && \ docker-php-ext-install -j$(nproc) gd zip && \ docker-php-ext-install bcmath && \ # 执行NodeSource脚本并安装Node.js curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ apt-get install -y nodejs && \ # 更新npm npm install -g npm && \ # 清理缓存 apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* COPY ./.docker/app/php.ini /usr/local/etc/php/conf.d/php.ini COPY app /var/www/app COPY bootstrap /var/www/bootstrap COPY config /var/www/config COPY database /var/www/database COPY public /var/www/public COPY resources /var/www/resources COPY routes /var/www/routes COPY storage /var/www/storage COPY artisan /var/www/artisan COPY package.json /var/www/package.json COPY vite.config.js /var/www/vite.config.js COPY composer.* ./ ENV COMPOSER_ALLOW_SUPERUSER=1 RUN curl -sS https://getcomposer.org/installer | php -- \ --filename=composer \ --install-dir=/usr/local/bin RUN composer install \ --no-interaction \ --no-plugins\ --no-suggest \ --no-scripts \ --no-autoloader \ --prefer-dist RUN composer dump-autoload --no-scripts --optimize && \ chown -R root:www-data /var/www && \ chmod 755 -R /var/www && \ chmod -R 775 /var/www/storage && \ chmod -R 775 /var/www/bootstrap/cache WORKDIR /var/www
方案2:在安装Node.js前重新更新APT缓存
若不想调整步骤顺序,可在安装Node.js前重新执行apt-get update,并提前安装依赖,同时去掉脚本的输出屏蔽以便排查:
# ... 前面的步骤保持不变 ... COPY composer.* ./ # 重新更新APT缓存,安装脚本依赖,去掉输出屏蔽以便排查错误 RUN apt-get update && apt-get install -y lsb-release gnupg curl && \ curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ apt-get install -y nodejs && \ # 清理本次操作的缓存 apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN npm install -g npm # ... 后面的步骤保持不变 ...
关键调整点
- 确保执行NodeSource脚本前,APT源列表可用(要么未清理过,要么重新执行了
apt-get update)。 - 提前安装脚本依赖:
lsb-release、gnupg、curl,避免脚本自动安装时出错。 - 去掉脚本的
>/dev/null 2>&1重定向,若再出错可查看具体错误日志,方便进一步排查。
内容的提问来源于stack exchange,提问作者pavel
相关产品推荐
相关产品推荐

