我通过 docker 运行闪亮的应用程序。但它可以在 RStudio 上运行,但是当我通过 docker 运行它时,它会出现错误:
Undefined error in httr call. httr output: Failed to connect to localhost port 4445 after 0 ms: Connection refused
闪亮代码:
# 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
RStudio 上一切都运行良好。但是当我访问 localhost:3838 时,我遇到了这个错误。 如何解决这个问题?
在容器上下文中,
localhost
解析为容器实例本身,而不是主机系统。如果您使用的是 Docker Dektop 并且想要通过已发布的端口,您可以尝试将 localhost
替换为 host.docker.internal
,即 :
remDr <- remoteDriver(
remoteServerAddr = "host.docker.internal", # Docker container host
port = 4445L, # Docker container port
browserName = "chrome",
)
虽然我更愿意使用 Docker Compose 并让它处理网络。 首先更新
remoteDriver()
调用,以便可以通过环境变量进行配置:
remDr <- remoteDriver(
remoteServerAddr = Sys.getenv("SELENIUM_HOST", "localhost"),
port = as.integer(Sys.getenv("SELENIUM_PORT", "4445")),
browserName = "chrome",
)
comopse.yaml
:services:
shiny-rselenium:
build: .
ports:
- "3838:3838"
environment:
- SELENIUM_HOST=selenium
- SELENIUM_PORT=4444
depends_on:
- selenium
selenium:
image: "selenium/standalone-chrome:4.2.2"
shm_size: 4g
PS > docker compose up -d
[+] Building 0.0s (0/0) docker:default
[+] Running 3/3
✔ Network shinydkr_default Created 0.1s
✔ Container shinydkr-selenium-1 Started 0.1s
✔ Container shinydkr-shiny-rselenium-1 Started 0.1s
PS > docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
shinydkr-selenium-1 selenium/standalone-chrome:4.2.2 "/opt/bin/entry_poin…" selenium 23 seconds ago Up 22 seconds 4444/tcp, 5900/tcp
shinydkr-shiny-rselenium-1 shinydkr-shiny-rselenium "R -e 'shiny::runApp…" shiny-rselenium 23 seconds ago Up 22 seconds 0.0.0.0:3838->3838/tcp
PS > docker compose down
[+] Running 3/3
✔ Container shinydkr-shiny-rselenium-1 Removed 10.4s
✔ Container shinydkr-selenium-1 Removed 4.3s
✔ Network shinydkr_default Removed