Cloud Build构建WordPress镜像时RUN命令生成文件未持久化问题
问题分析与解决
核心原因
你遇到的问题大概率是基础镜像us-docker.pkg.dev/ProjectImageWithApacheAndSQL把/var/www/html定义成了VOLUME。Docker中一旦镜像声明了VOLUME,后续构建步骤对该目录的修改不会被持久化到最终镜像层里——构建中途临时容器里能看到文件,但最终打包镜像时这些修改会被跳过,本地构建可能因为环境差异没暴露这个问题,但Cloud Build严格遵循镜像分层规则,所以就出现了文件消失的情况。
验证方法
先确认基础镜像是否真的声明了VOLUME:
docker inspect us-docker.pkg.dev/ProjectImageWithApacheAndSQL | grep -A 10 "Volumes"
如果输出里包含/var/www/html,那就坐实了这个问题。
解决方案
方案1:替换基础镜像
换用一个没有把/var/www/html设为VOLUME的WordPress基础镜像,比如基于官方WordPress镜像自行封装,去掉VOLUME声明即可。
方案2:调整构建路径绕开VOLUME
修改Dockerfile,先在非VOLUME目录完成构建,再复制到目标目录:
FROM us-docker.pkg.dev/ProjectImageWithApacheAndSQL RUN apt-get update && apt-get install -y # 修正原配置的$PWD问题:RUN命令默认工作目录是/,原替换会导致apache指向根目录,改为明确路径 RUN set -eux; \ find /etc/apache2 -name '*.conf' -type f -exec sed -ri -e "s!/var/www/html!/var/www/html!g" -e "s!Directory /var/www/!Directory /var/www/!g" '{}' +; # 安装Node和NPM RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \ apt-get install -y nodejs # 先把源码复制到临时构建目录(非VOLUME目录) COPY src /tmp/build/ # 复制wp-config到临时目录 COPY Build/wp-config.php /tmp/build/wp-config.php # 全局安装Gulp RUN npm install -g gulp # 在临时目录完成依赖安装与构建 RUN cd /tmp/build/wp-content/themes/treadmillv3 && \ npm i && gulp build # 将构建好的完整内容复制到/var/www/html RUN cp -r /tmp/build/* /var/www/html/ # 验证文件存在(可选) RUN ls -lta /var/www/html/wp-content/themes/treadmillv3 > /buildLog.txt CMD ["apache2-foreground"]
方案3:修改基础镜像
如果有权限修改基础镜像,直接删除其中VOLUME /var/www/html的声明,这样后续构建步骤对该目录的修改就能正常保存到最终镜像中。
内容的提问来源于stack exchange,提问作者Omario Mullings
相关产品推荐
相关产品推荐

