You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Selenium镜像构建容器后,为何无法在容器内连接Selenium?

问题根源分析

你遇到的连接拒绝问题,核心原因其实很直白:你替换了原selenium镜像的启动命令,导致容器里根本没启动Selenium服务!

咱们拆解开看:

  • 官方的selenium/standalone-chrome:3.11.0镜像,默认的CMD是启动Selenium Grid Hub的命令(用supervisord管理服务,让4444端口处于监听状态)。
  • 你在自定义Dockerfile里把CMD改成了["curl", "-v", "localhost:4444"],这就意味着容器启动后,只会执行curl命令,完全没启动Selenium服务——没有进程监听4444端口,自然会返回连接拒绝。

另外补充一点:原镜像的Selenium服务是用普通用户seluser运行的,你用sudo装curl没问题,但这不是当前问题的关键。

解决方案

要在同一个容器里既启动Selenium服务,又执行测试/编译操作,你需要用一个自定义启动脚本,先启动Selenium服务,再执行后续命令。

步骤1:创建启动脚本

在项目目录下新建一个entrypoint.sh文件,内容如下:

#!/bin/bash
# 启动Selenium服务(原镜像的启动命令,前台运行)
/usr/bin/supervisord -n &
# 等待服务启动完成(避免curl时服务还没就绪)
sleep 5
# 执行你的测试/编译命令,这里先保留curl测试
curl -v localhost:4444
# 保持容器运行(否则curl执行完容器会直接退出)
wait

步骤2:修改Dockerfile

调整你的Dockerfile,加入脚本复制和权限设置:

FROM selenium/standalone-chrome:3.11.0
# 切换到root用户安装依赖
USER root
RUN apt-get --assume-yes --quiet update && \
    apt-get --assume-yes --quiet install curl && \
    # 清理apt缓存,减小镜像体积
    rm -rf /var/lib/apt/lists/*
# 切回原镜像的普通用户seluser
USER seluser
# 复制启动脚本到容器内
COPY entrypoint.sh /home/seluser/
# 给脚本添加执行权限
RUN chmod +x /home/seluser/entrypoint.sh
# 设置容器启动时执行这个脚本
CMD ["/home/seluser/entrypoint.sh"]

步骤3:构建并运行镜像

执行你原来的命令即可:

docker build -t test . && docker run test

这样容器启动后,会先启动Selenium服务,等待服务就绪后再执行curl,你就能成功连接到4444端口了。如果后续要在容器里编译测试项目,只需要把entrypoint.sh里的curl命令替换成你的编译、测试命令即可。

内容的提问来源于stack exchange,提问作者flaz14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:56:49