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

Docker构建后容器内下载文件丢失问题排查求助

排查PHP应用Docker化后代码丢失问题

以下是按优先级排序的排查步骤和解决方案:

1. 先确认构建阶段是否成功生成文件

跳过docker-compose,单独构建镜像并启动临时容器查看目录内容:

docker build -t php-ujian .
docker run --rm -it php-ujian ls -la /var/www/ujian
  • 如果这里能看到文件:问题出在docker-compose的卷配置,直接看步骤3
  • 如果这里也看不到:问题在Dockerfile的下载解压命令,看步骤2

2. 检查Dockerfile中的下载解压命令

常见错误点:

  • 目录未提前创建:解压目标目录不存在会导致命令失败,需先创建:
    RUN mkdir -p /var/www/ujian
    
  • Git仓库下载链接错误:确保链接是tar包格式(比如GitHub的https://github.com/[user]/[repo]/archive/refs/heads/[branch].tar.gz),且加-L处理重定向:
    RUN curl -L [Git仓库tar包链接] | tar -xzf - -C /var/www/ujian
    
  • 顶层目录未剥离:Git tar包会包含一个顶层目录(如repo-main/),导致文件不在/var/www/ujian根目录,需加--strip-components=1:
    RUN curl -L [Git仓库tar包链接] | tar -xzf - --strip-components=1 -C /var/www/ujian
    
  • 权限不足:如果Dockerfile切换了非root用户,需确保解压前目录有写入权限,或解压后修改权限:
    RUN mkdir -p /var/www/ujian \
        && curl -L [Git仓库tar包链接] | tar -xzf - --strip-components=1 -C /var/www/ujian \
        && chown -R www-data:www-data /var/www/ujian
    
  • 私有仓库未认证:如果是私有仓库,需在curl中加入认证信息(建议用构建参数避免硬编码):
    ARG GIT_TOKEN
    RUN curl -L -u 你的Git用户名:${GIT_TOKEN} [私有仓库tar包链接] | tar -xzf - --strip-components=1 -C /var/www/ujian
    
    构建时传递参数:docker build --build-arg GIT_TOKEN=你的令牌 -t php-ujian .

查看构建日志定位错误:

重新构建并查看详细日志:

docker build --no-cache -t php-ujian .

重点看curl的HTTP状态码(需为200)、tar的解压输出(是否有文件列表),如果有报错直接对应修复。

3. 检查docker-compose.yml的卷挂载配置

如果构建阶段正常,但启动容器后目录为空,大概率是本地卷挂载覆盖了容器内目录:

  • 检查是否有类似配置:
    services:
      php:
        volumes:
          - ./本地目录:/var/www  # 这个配置会完全覆盖容器内的/var/www
    
  • 解决方案:
    • 如果不需要本地代码同步,直接删除这个卷挂载配置
    • 如果需要本地开发同步,只挂载需要修改的子目录(如./本地目录:/var/www/ujian/public),避免覆盖整个ujian目录
    • 如果要保留容器内代码同时同步本地修改,可改用命名卷,但需注意首次启动会复制容器内内容到卷

内容的提问来源于stack exchange,提问作者Liso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:25:56