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

Docker Compose依赖资源容器共享问题求解

可行的Docker服务间文件共享方案

针对你的需求,结合多阶段构建和命名卷预填充,可以解决所有问题,具体实现如下:

调整Dockerfile

优化多阶段构建逻辑,确保PHP镜像整合所有需要的静态资源(源代码静态文件+builder输出+PHP生成文件):

# 前端构建阶段
FROM node:current-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# PHP运行阶段:整合全量静态资源
FROM php:fpm-latest as php
WORKDIR /var/www/html
# 复制项目源代码(包含原public目录的静态文件)
COPY . .
# 覆盖builder生成的前端构建文件
COPY --from=builder /app/public/build/ public/build/
COPY --from=builder /app/public/js/ public/js/
# 执行PHP生成静态文件的命令(根据自身框架调整,比如Symfony的assets:install)
RUN php bin/console assets:install public/

# Caddy基础阶段:仅配置Caddy环境
FROM caddy:latest as caddy
WORKDIR /srv
COPY Caddyfile ./

编写docker-compose.yml

通过初始化服务预填充共享卷,让PHP和Caddy共享同一套静态资源:

version: '3.8'

services:
  # 初始化服务:将PHP镜像中完整的public目录复制到共享卷
  init-public:
    image: ${COMPOSE_PROJECT_NAME}-php:latest # 对应构建后的PHP镜像
    command: sh -c "cp -r /var/www/html/public/* /shared-public/"
    volumes:
      - public-data:/shared-public

  php:
    build:
      context: .
      target: php
    image: ${COMPOSE_PROJECT_NAME}-php:latest
    volumes:
      - public-data:/var/www/html/public
    depends_on:
      init-public:
        condition: service_completed_successfully

  caddy:
    build:
      context: .
      target: caddy
    volumes:
      - public-data:/srv/public
    ports:
      - "80:80"
    depends_on:
      init-public:
        condition: service_completed_successfully
      php:
        condition: service_started

volumes:
  public-data:

方案适配所有需求的说明

  • 需求1/2:builder阶段生成的文件通过COPY进入PHP镜像,再由初始化服务同步到共享卷,PHP和Caddy挂载后均可访问。
  • 需求3:PHP阶段生成的文件会被初始化服务一并复制到共享卷,Caddy可直接读取。
  • 需求4:PHP和Caddy挂载同一个命名卷public-data,PHP运行时创建的上传文件会实时写入卷,Caddy能立即访问。
  • 需求5:源代码中的静态文件在构建PHP镜像时已被复制,初始化服务会同步到共享卷;若需开发时实时更新,可给PHP服务添加特定目录的绑定挂载(比如./public/img:/var/www/html/public/img),避免覆盖构建好的文件。

之前方案失效的原因

  • 方案1:PHP和Caddy的public目录是各自镜像内的独立目录,无共享机制,运行时生成的文件无法跨服务访问。
  • 方案2:直接绑定挂载整个public目录会覆盖镜像内构建好的文件,导致builder和PHP生成的资源丢失。
  • 之前的共享卷方案无效,大概率是因为没有预填充构建后的静态文件,卷为空或使用了旧的缓存内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:32:44