Shopware 6.4 Docker预构建镜像缺失子主题Assets问题咨询
问题背景
我们通过Docker托管Shopware 6.4店铺,预构建流程如下:
- 无数据库的构建容器中执行:
CI=1 SHOPWARE_SKIP_THEME_COMPILE=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true DATABASE_URL= bin/build-storefront.sh - 将构建内容复制到生产容器:
COPY --chown=www-data:www-data --from=build /var/www . - 生产容器启动时执行:
bin/console theme:dump bin/console theme:compile --keep-assets || true
流程可行,但public/bundles/ourchildtheme/assets目录缺失(icon和logo目录正常),手动执行bin/console assets:install无效,仅全量构建的bin/build.sh可解决,但不符合预构建设计初衷。
1. 该asset文件夹应在流程的哪个环节生成?
该目录应在预构建阶段的静态资源同步环节生成。
Shopware主题的自定义assets(如JS/CSS、静态资源文件)默认存储在主题的src/Resources/app/storefront/assets目录下,需要通过assets:install命令将这些文件复制到public/bundles对应目录中。你当前使用的bin/build-storefront.sh仅聚焦于Storefront的前端代码编译,未包含主题静态资源的同步步骤;而全量的bin/build.sh整合了assets:install、主题编译等流程,所以能生成该目录。
2. 应将该步骤放在预构建阶段还是容器启动阶段?
必须放在预构建阶段执行,完全符合预构建设计初衷。
静态资源的同步操作不需要依赖数据库,完全可以在无数据库的构建容器中完成。将该步骤放在预构建阶段,既能提前完成静态资源处理,避免生产容器启动时重复执行,又能确保复制到生产容器的文件包含完整的assets目录,无需在启动阶段额外处理。
调整后的预构建命令
在构建容器中,执行build-storefront.sh之后补充assets:install命令(需添加--symlink=false参数,确保生成实体文件而非软链接,避免复制到生产容器后失效):
CI=1 SHOPWARE_SKIP_THEME_COMPILE=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true DATABASE_URL= bin/build-storefront.sh bin/console assets:install --symlink=false
调整后,预构建阶段会完整生成public/bundles/ourchildtheme/assets目录,复制到生产容器后启动阶段仅需执行主题编译命令即可,完全契合预构建的设计目标。
内容的提问来源于stack exchange,提问作者Alex

