GitLab CI构建Docker镜像时PHP配置文件未复制问题排查
问题描述
我正在使用GitLab CI结合以下Dockerfile构建Docker镜像:
ARG BUILD_VERSION="prod" FROM php:8.2.1-fpm as base RUN apt-get update && apt-get install -y libicu-dev libonig-dev libcurl3-dev libxml2-dev ssh git nano mc \ &&docker-php-ext-install pdo_mysql mysqli mbstring curl intl xml \ &&apt-get clean && rm -rf /var/lib/apt/lists/* WORKDIR /var/www/html COPY --from=composer:latest /usr/bin/composer /usr/bin/composer COPY ["php/conf.d/error_reporting.ini", "/php/conf.d/timezone.ini", "/usr/local/etc/php/conf.d/"] FROM base AS version-prod RUN composer update FROM base AS version-dev RUN pecl install xdebug && rm -rf /tmp/pear COPY ["php/conf.d/xdebug.ini" , "/usr/local/etc/php/conf.d/"] EXPOSE 22 FROM version-${BUILD_VERSION} AS current # This select current version FROM current
对应的gitlab-ci.yml内容如下:
Build: stage: build image: docker:latest-git services: - docker:dind before_script: - docker info - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker pull $CI_REGISTfRY_IMAGE:php-latest || true - docker build --cache-from $CI_REGISTRY_IMAGE:php-latest --tag $CI_REGISTRY_IMAGE:php-$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:php-latest -f ./Dockerfile . - docker push $CI_REGISTRY_IMAGE:php-latest - docker push $CI_REGISTRY_IMAGE:php-$CI_COMMIT_SHA
但当我基于该镜像部署容器后,发现容器中不存在php/conf.d/error_reporting.ini和/php/conf.d/timezone.ini文件,请问这是什么原因?
问题原因分析
1. COPY指令的源路径格式错误
你在base阶段写的COPY指令有问题:
COPY ["php/conf.d/error_reporting.ini", "/php/conf.d/timezone.ini", "/usr/local/etc/php/conf.d/"]
数组格式的COPY规则是:最后一个元素是目标目录,前面所有元素都是本地要复制的源文件路径。你这里把/php/conf.d/timezone.ini当成了源文件,这是错误的——本地源文件路径应该是相对路径php/conf.d/timezone.ini,带根路径的写法会让Docker去宿主机根目录找这个文件,显然找不到,导致这个文件根本没被复制进去,甚至可能整个COPY指令执行失败(只是构建日志没报错的话,Docker会忽略不存在的源文件)。
正确写法应该是:
COPY ["php/conf.d/error_reporting.ini", "php/conf.d/timezone.ini", "/usr/local/etc/php/conf.d/"]
或者更简洁的非数组格式:
COPY php/conf.d/error_reporting.ini php/conf.d/timezone.ini /usr/local/etc/php/conf.d/
2. 构建缓存复用导致的问题
GitLab CI构建时用了--cache-from参数拉取旧镜像缓存,如果之前的镜像就没正确复制这两个文件,缓存会被直接复用,新构建的镜像自然还是没有这两个文件。可以临时去掉--cache-from参数重新构建,验证是否解决问题。
3. 额外的缩进错误(影响xdebug.ini)
你的version-dev阶段里,COPY指令的缩进和RUN指令不对齐,会被当成RUN命令的一部分执行,导致xdebug.ini也无法正确复制到镜像里,修正后的写法应该是:
FROM base AS version-dev RUN pecl install xdebug && rm -rf /tmp/pear COPY ["php/conf.d/xdebug.ini" , "/usr/local/etc/php/conf.d/"] EXPOSE 22
内容的提问来源于stack exchange,提问作者Log Edge
相关产品推荐
相关产品推荐

