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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:53:18