API Platform 3.2连接本地数据库时出现pwa主机解析错误
API Platform 3.2 连接本地数据库的问题与解决办法
问题背景
- 受影响版本:API Platform 3.2
- 需求:生产环境运行API Platform时,弃用Docker内置数据库服务,改用宿主机本地数据库
- 操作:执行启动命令时指定
compose.yaml和compose.prod.yaml配置文件,同时在compose.prod.yaml中为php服务设置network_mode: "host"以共享宿主机网络 - 启动后出现DNS解析错误,日志如下:
"duration":0.013162129
"err_id":"y7f98si24"
"err_trace":"reverseproxy.statusError (reverseproxy.go:1267)"
"level":"error"
"logger":"http.log.error.log0"
"msg":"dial tcp: lookup pwa on 212.227.123.16:53: no such host"
启动命令:
SERVER_NAME=preprod.website.fr APP_SECRET=a_secret_key CADDY_MERCURE_JWT_SECRET=ChangeThisMercureHubJWTSecretKey docker compose -f compose.yaml -f compose.prod.yaml up --wait
错误原因
当给php服务设置network_mode: "host"后,容器直接使用宿主机的网络栈,脱离了Docker默认的桥接网络。Docker内部的服务域名(比如pwa)依赖Docker内置的DNS服务解析,而宿主机的DNS无法识别这些内部域名,因此出现找不到pwa主机的错误。
解决办法
放弃直接给php服务设置host网络模式,通过添加socat代理服务实现容器访问本地数据库,同时保持php服务在Docker默认网络中,确保能正常解析内部服务域名。更新后的compose.prod.yaml配置如下:
proxy-relay: image: alpine/socat:latest network_mode: host command: TCP-LISTEN:3306,fork,bind=host.docker.internal TCP-CONNECT:127.0.0.1:3306 extra_hosts: - host.docker.internal:host-gateway php: build: context: ./api target: frankenphp_prod environment: APP_SECRET: ${APP_SECRET} MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} DATABASE_URL: mysql://${MARIADB_USER:-myuser}:${MARIADB_PASSWORD:-mypassword}@host.docker.internal:3306/${MARIADB_DATABASE:-mydatabase}?serverVersion=mariadb-${MARIADB_VERSION:-10.11.6}&charset=utf8mb4 extra_hosts: - host.docker.internal:host-gateway
配置说明
- proxy-relay服务:使用
socat工具做端口转发,将容器侧的3306端口请求转发到宿主机的3306端口;network_mode: host让该服务直接使用宿主机网络,extra_hosts配置确保host.docker.internal指向宿主机网关,从而能访问本地数据库。 - php服务:移除
network_mode: "host"配置,通过extra_hosts让容器能识别host.docker.internal,并在DATABASE_URL中使用该地址连接本地数据库,同时保留在Docker默认网络中,正常解析内部服务域名。
内容的提问来源于stack exchange,提问作者Victoria
相关产品推荐
相关产品推荐

