容器执行apt update返回错误码,寻求技术解决方案
解决Docker构建PHP镜像时apt update执行Post-Invoke脚本报错问题
问题场景
基于Slim Framework搭建Docker容器环境,首次构建正常,但删除容器及镜像重新构建时,Dockerfile中的apt update命令报错,错误信息为:
E: Problem executing scripts APT::Update::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true' #6 21.17 E: Sub-process returned an error code
直接运行docker run -it php:8.1-fpm进入容器执行apt update也出现相同错误,已尝试替换apt为apt-get、切换docker-compose命令、root权限操作、重装Docker等方法,均无效。
解决思路
1. 移除APT的清理脚本配置
PHP官方镜像默认配置了APT清理脚本,可能因权限或目录问题导致执行失败,可先移除该配置再执行更新:
RUN rm -f /etc/apt/apt.conf.d/docker-clean \ && apt update \ && apt install -y zlib1g-dev g++ git libicu-dev zip libzip-dev zip libpq-dev \ && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ && docker-php-ext-install intl opcache pdo pdo_pgsql \ && pecl install apcu \ && docker-php-ext-enable apcu \ && docker-php-ext-configure zip \ && docker-php-ext-install zip
2. 更换APT源
默认Debian源可能存在连接或同步问题,更换为国内镜像源:
RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list \ && echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >> /etc/apt/sources.list \ && echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list \ && echo "deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list \ && echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list \ && echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list \ && apt update \ && apt install -y zlib1g-dev g++ git libicu-dev zip libzip-dev zip libpq-dev \ && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ && docker-php-ext-install intl opcache pdo pdo_pgsql \ && pecl install apcu \ && docker-php-ext-enable apcu \ && docker-php-ext-configure zip \ && docker-php-ext-install zip
3. 调整缓存目录权限
手动创建缓存目录并设置正确权限,避免清理脚本执行时出错:
RUN mkdir -p /var/cache/apt/archives/partial \ && chmod -R 755 /var/cache/apt \ && apt update \ && apt install -y zlib1g-dev g++ git libicu-dev zip libzip-dev zip libpq-dev \ && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ && docker-php-ext-install intl opcache pdo pdo_pgsql \ && pecl install apcu \ && docker-php-ext-enable apcu \ && docker-php-ext-configure zip \ && docker-php-ext-install zip
4. 更换PHP镜像变体
改用Alpine版本的PHP镜像,使用apk包管理工具替代APT,从根源规避问题:
FROM php:8.1-fpm-alpine RUN apk add --no-cache zlib-dev g++ git icu-dev zip libzip-dev postgresql-dev \ && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ && docker-php-ext-install intl opcache pdo pdo_pgsql \ && pecl install apcu \ && docker-php-ext-enable apcu \ && docker-php-ext-configure zip \ && docker-php-ext-install zip
5. 重新拉取基础镜像
可能是本地的php:8.1-fpm镜像损坏,执行以下命令重新拉取:
docker rmi php:8.1-fpm docker pull php:8.1-fpm
内容的提问来源于stack exchange,提问作者MaLSan
相关产品推荐
相关产品推荐

