我们正在尝试在 Docker 容器内运行 chrome。
构建后的docker run命令如下:
docker run \
--rm \
-ti \
--add-host=example.my_domain.localhost:172.21.0.13 \
--env="APP_ENV=test" \
--privileged \
--volume "$volumeDir:/app" \
--cap-add SYS_ADMIN \
--net custom_network \
built_image_tag bash
172.21.0.13 是一个示例,表示同一网络中另一个容器的 IP。
进入容器后,主机文件如下所示:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.21.0.13 example.my_domain.localhost
172.21.0.15 7229a8eac11e
并按预期运行:
$ wget example.my_domain.localhost
Connecting to example.my_domain.localhost (example.my_domain.localhost)|172.21.0.13|:80... connected.
产生正确的连接
但是在浏览器中运行连接:
$ google-chrome http://example.my_domain.localhost
导致ERR_CONNECTION_REFUSED。
浏览器能够导航到任何其他网站。
谢谢。
编辑: 请注意,wget 和浏览器的打开都是在内部容器中启动的,因为我们使用 chrome headless 进行测试。
最佳答案
就我而言,我使用 spatie/browsershot ,但我相信根本问题是相同的,所以我希望我的答案是有用的。
当以下部分到位后,我的 ERR_CONNECTION_REFUSED
错误得到解决:
1) 托管您的站点的 docker 容器需要网络别名。
这不是在 Puppeteer 容器中添加主机文件条目,而 Chrome 在我的测试中似乎并未支持该条目。
services:
my-nginx-container:
...
networks:
internal:
aliases:
# so we can access our sites directly (by their domain) from other containers.
- my-docker-site.com
2) 添加以下 Puppeteer 参数
--disable-web-security'
和 --enable-features=NetworkService
。
我意识到原来的问题不是询问 Browsershot,而是像这样添加参数:
$browsershot = Browsershot::url('https://my-docker-site.com')
->setOption('args', ['--disable-web-security', '--enable-features=NetworkService'])
这样做使我能够在容器内运行 Browsershot 和 Puppeteer,并且 Chrome 能够通过引用其他容器内托管的网站的域名来访问这些网站。
关于docker - docker 内的 Chrome ERR_CONNECTION_REFUSED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57167903/