Headless Chrome在Docker中无法访问Docker主机,而curl可以的解决方案

63次阅读
没有评论

问题描述

在一个PHP(Drupal)项目中使用headless Chrome / Chromium渲染PDF。在Docker开发环境中无法正常工作,但在专用验收服务器上可以正常运行。问题出现在Docker环境中,用户运行Docker(桌面版)在WSL2上的Windows 10机器上,并使用docker-compose配置项目。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

1. 安装Chromium

用户已经尝试使用wodby/drupal-php镜像和selenium/standalone-chrome镜像,但遇到问题。为了解决这个问题,用户决定在自定义的PHP容器中安装Chromium。以下是安装Chromium的步骤:

在Dockerfile中添加以下命令来安装Chromium:

ARG PHP_TAG
FROM wodby/drupal-php:${PHP_TAG}
USER root
RUN apk update; \
    apk upgrade; \
    apk add chromium;

2. 确认网络别名

为了确保从PHP容器中可以调用开发域名,用户在docker-compose.yml中为nginx容器添加了网络别名。以下是确认网络别名的步骤:

docker-compose.yml中为nginx容器添加网络别名:

nginx:
  ...
  networks:
    default:
      aliases:
        - somedomain.site

3. 排查Chromium无响应问题

用户发现当使用Curl测试域名时,一切正常。但是,使用Chromium时,URL没有响应。对于外部域名(如https://devops.stackexchange.com/),Chromium工作正常。这可能是因为Chromium使用了一种与Docker域名不兼容的DNS。下面是解决Chromium无响应问题的步骤:

首先,尝试使用Chromium的命令行参数来运行headless Chromium,并查看是否有错误消息输出。以下是使用Chromium的命令行参数来测试域名的示例:

chromium-browser --headless --no-sandbox --dump-dom http://somedomain.site/

用户注意到以下警告消息:[0727/124526.452320:WARNING:dns_config_service_posix.cc(342)] Failed to read DnsConfig。这可能是问题的原因。虽然用户尝试了一个其他的Docker镜像来解决这个问题,但这个镜像也遇到了相同的问题。

4. 解决DNS配置问题

为了解决DNS配置问题,需要进一步调查。用户可以尝试以下步骤:

  • 确保Docker容器可以访问主机网络。如果Docker容器无法访问主机网络,可以考虑检查Docker网络配置。
  • 检查Chromium在Docker容器中的DNS设置,确保它能够正确解析Docker域名。
  • 尝试更新Chromium或相关组件的版本,以解决可能存在的问题。

5. 查找更多解决方案

如果上述步骤无法解决问题,用户可以继续查找其他解决方案。用户已经在Stack Overflow上找到一个相关的讨论(https://stackoverflow.com/questions/54838341/running-headless-chromium-browser-throws-error-failed-to-read-dnsconfig-insid),但这个解决方案在他的情况下并没有有效。

用户可以在相关论坛、社区或Docker的官方文档中寻找更多关于Chromium在Docker中使用的问题以及相应的解决方案。

参考链接

注意事项

  • 用户需要确保自己的Docker环境与所提供的示例代码一致,特别是Docker版本和所使用的镜像。
  • 在更新版本或进行任何更改之前,请务必备份相关配置和数据。

正文完