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/ujiandocker 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
相关产品推荐
相关产品推荐

