Docker构建阶段无法使用卷,如何将frontend构建产物共享到php-fpm容器
实现方案
1. 调整Dockerfile,跨阶段复制产物
利用Docker多阶段构建的COPY --from语法,直接把frontend阶段生成的产物复制到php-fpm对应的dev阶段即可,修改后的docker/php/Dockerfile内容如下:
FROM alpine:3.13 AS frontend WORKDIR /app COPY . . RUN apk add npm RUN npm install RUN npx webpack -p --color --progress FROM php:7.4-fpm AS dev ENTRYPOINT ["docker-php-entrypoint"] WORKDIR /app # 新增以下语句,从frontend阶段复制所有构建产物到当前阶段的/app目录 COPY --from=frontend /app /app COPY ./docker/php/www-dev.conf /usr/local/etc/php-fpm.d/www.conf CMD ["php-fpm"]
2. 精简docker-compose.yml配置
不需要单独部署frontend服务,因为frontend阶段的产物已经在构建php-fpm镜像时内置进去了,调整后的docker-compose.yml如下:
version: '3.7' services: php-fpm: build: context: . dockerfile: docker/php/Dockerfile target: dev volumes: - .:/app # 开发环境保留本地挂载的话,新增这行排除静态产物目录,避免本地空目录覆盖镜像里的构建文件 - /app/static
报错根因
你之前遇到的报错是两个问题共同导致的:
- 多阶段构建的不同阶段互相独立,frontend阶段生成的产物默认不会同步到dev阶段,需要主动复制
- 你配置的volume是运行时挂载,构建镜像阶段不会生效,php-fpm镜像构建时拿不到前端产物,运行时挂载的本地目录又没有提前构建好的
frontend.version文件,就触发了文件读取失败的报错。
补充说明
如果是开发场景需要实时调试前端代码,可以在本地单独跑npm的watch命令,把产物生成到本地的static目录,这样不需要每次修改代码都重新构建php-fpm镜像,本地挂载的目录也能读到最新的前端产物。生产环境可以直接删除volume挂载,镜像内部已经包含了所有需要的代码和构建产物。
内容的提问来源于stack exchange,提问作者Ponywka
相关产品推荐
相关产品推荐

