构建集成Mercure/Vulcain的Caddy时遇多类错误求助
问题解决方案:基于dunglas/symfony-docker的Caddy+Mercure+PostgreSQL问题排查
1. 解决crypto/ecdh包不在GOROOT的错误
这个错误源于构建Caddy时使用的Go版本过低,crypto/ecdh是Go 1.20+新增的标准库包,而Mercure v0.15.2依赖该包。解决步骤:
- 确保使用Caddy 2.7.2对应的builder镜像,比如
caddy:2.7.2-builder-alpine,该镜像内置的Go版本满足要求。 - 在构建Caddy的Dockerfile片段中,直接指定匹配的Caddy版本进行构建,避免依赖旧版Go环境。
2. 解决Mercure与Caddy的版本冲突问题
Mercure v0.15.2明确要求依赖Caddy v2.7.2及以上版本,指定Caddy v2.6.4必然导致版本不兼容。解决方法:
- 统一版本匹配:在Caddy构建命令中指定Caddy v2.7.2,并搭配Mercure v0.15.2,示例构建代码:
RUN xcaddy build v2.7.2 \ --with github.com/dunglas/mercure/caddy@v0.15.2 \ --with github.com/dunglas/vulcain/caddy
- 不要自行降低Caddy版本,严格遵循Mercure官方的版本依赖要求。
3. 解决PostgreSQL postgres角色不存在的错误
此前环境正常,更换Caddy版本后出现该问题,通常是数据卷残留或服务启动顺序问题:
- 清理旧数据卷:PostgreSQL容器首次启动时会初始化默认角色,若旧数据卷残留自定义配置,会导致角色异常。执行以下命令重置数据卷:
docker-compose down -v docker-compose up -d
- 检查环境变量配置:确认
docker-compose.yml中PostgreSQL服务的POSTGRES_USER配置,若设置为非postgres的值,需同步修改Symfony的DATABASE_URL中的用户信息;若需要默认的postgres角色,确保POSTGRES_USER=postgres。 - 添加服务健康检查:确保应用服务在PostgreSQL完全初始化后再启动,避免连接时角色未创建完成。在
docker-compose.yml中为PostgreSQL添加健康检查:
services: database: image: postgres:15-alpine environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: app healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 php: depends_on: database: condition: service_healthy
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

