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容器。
修复步骤
将两个容器加入同一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
- 创建自定义网络:
修改Shiny代码中的Selenium地址
将remoteServerAddr从localhost改为Selenium容器的名称selenium-chrome,端口改为Selenium容器内部的默认端口4444(同一网络下直接使用容器内部端口,无需宿主机映射的4445):remDr <- remoteDriver( remoteServerAddr = "selenium-chrome", # 改为Selenium容器名称 port = 4444L, # 改为容器内部端口 browserName = "chrome", )可选:优化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
相关产品推荐
相关产品推荐

