Symfony集成Mercure(Docker Compose配置)启动时出现MERCURE_JWT_SECRET未设置警告的问题求助
看起来你已经在.env.local里正确定义了MERCURE_JWT_SECRET,但Docker Compose启动时还是提示变量未设置,这大概率是环境变量没有被正确注入到Mercure容器里导致的。我来帮你一步步排查解决:
先定位问题根源
Docker Compose的警告明确说MERCURE_JWT_SECRET变量未设置,说明你的.env.local文件里的变量没有被成功加载到Mercure服务中。我们从最常见的问题开始排查:
1. 验证Docker Compose是否正确读取了变量
运行这条命令,查看Mercure服务的最终生效配置,确认MERCURE_JWT_SECRET是否被加载:
docker-compose config --services mercure
在输出结果里搜索MERCURE_JWT_SECRET:
- 如果显示的值是
!MyMercureHubJWTSecretKey!,说明变量已经加载,警告可能是Caddy启动缓存导致的(可以尝试清理Mercure卷:docker-compose down -v后重启); - 如果显示为空或找不到这个变量,那就是
.env.local没有被正确加载,继续下一步排查。
2. 检查env_file的路径是否正确
你的Docker Compose里配置的env_file: ./symfony/.env.local,这个路径是相对于docker-compose.yml所在目录的。请确认你的项目结构是否符合预期:
你的项目根目录/ ├── docker-compose.yml # 这个文件的位置 └── symfony/ └── .env.local # 你的.env.local文件
如果结构不对(比如docker-compose.yml放在了symfony目录内),需要把路径改成./.env.local。你可以用ls -la命令查看当前目录结构,确认路径匹配。
3. 检查.env.local的格式和权限
- 格式检查:打开
.env.local,确保MERCURE_JWT_SECRET=!MyMercureHubJWTSecretKey!这一行没有被注释(前面没有#),变量名没有拼写错误(比如少了下划线、大小写错误),行尾也没有多余空格; - 权限检查:Docker需要能读取这个文件,运行这条命令修改权限:
chmod 644 ./symfony/.env.local
4. 临时测试:直接在Docker Compose里写死变量
为了排除路径/权限问题,你可以临时在Mercure服务的environment里直接写死变量值:
environment: # Uncomment the following line to disable HTTPS, SERVER_NAME: ':3000' MERCURE_PUBLISHER_JWT_KEY: !MyMercureHubJWTSecretKey! MERCURE_SUBSCRIBER_JWT_KEY: !MyMercureHubJWTSecretKey! # 其他原有配置保持不变
然后重启容器:
docker-compose down && docker-compose up -d mercure
如果警告消失了,说明确实是.env.local加载的问题,回到步骤2和3确认路径、格式、权限;如果还是有警告,可能是Caddy的dev.Caddyfile有额外的变量引用(这种情况很少见)。
5. 清理Mercure缓存卷(可选)
如果上面的步骤都没问题,但警告仍存在,可能是Mercure的配置卷有缓存残留,运行这条命令彻底清理后重启:
docker-compose down -v && docker-compose up -d mercure
额外优化建议
你的.env.local里的MERCURE_URL和MERCURE_PUBLIC_URL用了https://,但你的Mercure服务配置的是SERVER_NAME: ':3000',并且用的是dev.Caddyfile(默认是HTTP模式),建议把这两个变量改成HTTP:
MERCURE_URL=http://localhost:3000/.well-known/mercure MERCURE_PUBLIC_URL=http://localhost:3000/.well-known/mercure
避免因为HTTPS配置不匹配导致的连接失败问题。
内容来源于stack exchange

