使用imaginary作为图片代理访问DDEV中Drupal图片时连接被拒
解决方案:Imaginary无法访问DDEV本地图片的问题
问题根源
Imaginary运行在独立Docker容器中,尝试解析imageproxy.ddev.site时,容器内DNS会将该域名指向自身的127.0.0.1,但容器未监听443端口,因此触发连接拒绝错误。外部图片能正常访问是因为解析的是公网IP,不存在本地网络隔离问题。
具体解决方法
方法1:加入DDEV的Docker网络(推荐)
将Imaginary容器接入DDEV项目的默认Docker网络,使其能正确解析DDEV内部域名:
- 查看DDEV项目对应的Docker网络名称:
输出示例:ddev describe | grep "Docker network"Docker network: ddev-imageproxy-default - 修改Imaginary的
docker-compose.yml,添加网络配置:version: "3" services: imaginary: image: h2non/imaginary ports: - "8088:8088" environment: - PORT=8088 command: -concurrency 50 -enable-url-source networks: - default - ddev-imageproxy-default # 替换为你查到的DDEV网络名称 networks: ddev-imageproxy-default: external: true - 重启Imaginary容器:
docker-compose down && docker-compose up -d - 使用DDEV内部域名构造图片请求,将原URL中的
imageproxy.ddev.site替换为imageproxy.ddev.internal,例如:http://localhost:8088/crop?width=500&height=400&url=https://imageproxy.ddev.internal/sites/default/files/styles/wide/public/2024-11/8vwp5n_0.jpg.webp
方法2:直接使用DDEV Web容器IP
跳过域名解析,用DDEV Web容器的IP作为图片源地址:
- 获取DDEV Web容器的IP:
ddev exec ip addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}' - 构造请求时用该IP替换域名,优先使用HTTP协议避免证书问题:
http://localhost:8088/crop?width=500&height=400&url=http://172.18.0.3/sites/default/files/styles/wide/public/2024-11/8vwp5n_0.jpg.webp
方法3:临时修改容器内DNS映射
在Imaginary容器内手动添加主机映射,强制域名指向宿主机IP:
- 进入Imaginary容器:
docker exec -it <imaginary-container-name> /bin/sh - 修改
/etc/hosts文件,添加宿主机IP与域名的映射:192.168.1.100 imageproxy.ddev.site # 替换为你的宿主机IP
验证步骤
重启Imaginary后,可在容器内测试连接是否正常:
docker exec -it <imaginary-container-name> curl -I https://imageproxy.ddev.internal/sites/default/files/styles/wide/public/2024-11/8vwp5n_0.jpg.webp
返回200状态码即为连接正常。
内容的提问来源于stack exchange,提问作者Oskar Calvo
相关产品推荐
相关产品推荐

