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

Docker部署Shiny+RSelenium应用连接被拒问题求助

Docker部署Shiny+RSelenium应用连接失败问题

在RStudio中运行集成RSelenium的Shiny应用完全正常,但通过Docker部署后,访问localhost:3838时出现以下错误:

Undefined error in httr call. httr output: Failed to connect to localhost port 4445 after 0 ms: Connection refused

以下是相关代码与操作步骤,请求解决:

Shiny代码(app.R)

# app.R
library(shiny)
library(RSelenium)

ui <- fluidPage(
  actionButton("btn", "Click Me"),
  textOutput("result")
)

server <- function(input, output, session) {
  # Start the remote driver
  remDr <- remoteDriver(
    remoteServerAddr = "localhost",  # Docker container host
    port = 4445L,  # Docker container port
    browserName = "chrome",
  )
  observeEvent(input$btn, {
      output$result <- renderText({
        remDr$open()
  
        # Navigate to a website (e.g., Google)
        remDr$navigate("https://www.google.com")
        remDr$maxWindowSize()
  
        # Perform some actions (e.g., print page title)
        title <- remDr$getTitle()
        
        return(as.character(title))
      })
      
})
  session$onSessionEnded(function() {
    # Close the remote driver
    remDr$close()
  })
}

shinyApp(ui, server)

Dockerfile

FROM rocker/shiny:4

# Install R packages required 
# Change the packages list to suit your needs
RUN R -e "install.packages(c('shiny', 'RSelenium', 'httr'), dependencies=TRUE)"

# Copy the Shiny app files into the image
COPY app.R /srv/shiny-server/

# Expose port 3838 for Shiny app
EXPOSE 3838

# Run Shiny app on container start
CMD ["R", "-e", "shiny::runApp('/srv/shiny-server/app.R', host = '0.0.0.0', port = 3838)"]

执行的Docker命令

docker pull selenium/standalone-chrome:4.2.2
docker run -d -p 4445:4444 --shm-size 4g selenium/standalone-chrome:4.2.2
docker build -t shiny-rselenium .
docker run -p 3838:3838 shiny-rselenium

解决方案

核心问题

Docker容器默认处于独立的网络空间,Shiny容器里的localhost指向容器自身,而非宿主机的localhost,因此无法连接到宿主机上运行的Selenium容器。

修复步骤

  1. 将两个容器加入同一Docker网络

    • 创建自定义网络:
      docker network create shiny-selenium-net
      
    • 启动Selenium容器时加入该网络:
      docker run -d --network shiny-selenium-net --name selenium-chrome --shm-size 4g selenium/standalone-chrome:4.2.2
      
    • 启动Shiny容器时加入同一网络:
      docker run -p 3838:3838 --network shiny-selenium-net shiny-rselenium
      
  2. 修改Shiny代码中的Selenium地址
    将remoteServerAddr从localhost改为Selenium容器的名称selenium-chrome,端口改为Selenium容器内部的默认端口4444(同一网络下直接使用容器内部端口,无需宿主机映射的4445):

    remDr <- remoteDriver(
      remoteServerAddr = "selenium-chrome",  # 改为Selenium容器名称
      port = 4444L,  # 改为容器内部端口
      browserName = "chrome",
    )
    
  3. 可选:优化Shiny代码逻辑

    • 避免在renderText中重复初始化浏览器,建议在服务器启动时完成初始化,用on.exit确保连接关闭:
      server <- function(input, output, session) {
        remDr <- remoteDriver(
          remoteServerAddr = "selenium-chrome",
          port = 4444L,
          browserName = "chrome"
        )
        
        # 初始化连接
        observe({
          req(session)
          remDr$open()
          on.exit(remDr$close(), add = TRUE)
        })
        
        observeEvent(input$btn, {
          output$result <- renderText({
            remDr$navigate("https://www.google.com")
            remDr$maxWindowSize()
            title <- remDr$getTitle()
            as.character(title)
          })
        })
      }
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:08:20