【问题标题】:Need odbc driver in dockerfile for my r shiny app我的 r 闪亮应用程序需要 dockerfile 中的 odbc 驱动程序
【发布时间】:2020-08-30 06:28:44
【问题描述】:

我正在制作一个闪亮的 R 应用程序,它使用 DBI 和 odbc 调用数据库(SQL Server)并显示一个表。我的应用程序在我的本地机器上完美运行。但是,当我尝试将闪亮的应用程序 dockerize 时,它​​只是无法启动。不知道为什么这不起作用。

我觉得我可能需要在我的 dockerfile 中安装 odbc 驱动器。也许我还缺少其他东西......

我是 docker 新手。如果有人可以展示我如何修改我的 dockerfile 以便我的闪亮应用程序也可以用作 docker 容器,我将不胜感激。

下面是我的dockerfile:

# Base image https://hub.docker.com/u/rocker/
FROM rocker/shiny:latest

# system libraries of general use
RUN apt-get update -qq && apt-get -y --no-install-recommends install \
    libxml2-dev \
    libcairo2-dev \
    libsqlite3-dev \
    libmariadbd-dev \
    libpq-dev \
    libssh2-1-dev \
    unixodbc-dev \
    libcurl4-openssl-dev \
    libssl-dev

## update system libraries
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get clean

# Install R packages that are required
RUN R -e "install.packages(c('dplyr','DT', 'DBI', 'odbc'), repos='http://cran.rstudio.com/')"
    
# Copy configuration files into the Docker image
COPY shiny-server.conf  /etc/shiny-server/shiny-server.conf
COPY /app /srv/shiny-server/

# Make the ShinyApp available at port 80
EXPOSE 80

# Copy further configuration files into the Docker image
COPY shiny-server.sh /usr/bin/shiny-server.sh

CMD ["/usr/bin/shiny-server.sh"]

下面是我闪亮的 ui.r:

ui <- fluidPage(
    
    titlePanel("Database table"),    
    sidebarLayout(
        sidebarPanel(),
        mainPanel(
            fluidRow (
                column(12, DT::dataTableOutput('datatable')) )
        )
    )
)

我的服务器.r

server <- function(input, output, session) {
    conn <- DBI::dbConnect(odbc::odbc(),
                           Driver = "ODBC Driver 17 for SQL Server",
                           Server = 'xxxxxx',
                           Database = "xxxxxx",
                           UID = "xxxxxx",
                           PWD = 'xxxxxxx',
                           port=1433)
    df = dbGetQuery(conn, "SELECT * FROM myTable")
    dbDisconnect(conn)    
    output$datatable <- DT::renderDataTable({
        DT::datatable(df)
    })
}

global.r:

library(shiny)
library(DBI)
library(odbc)
library(dplyr)
library(DT)

【问题讨论】:

  • 我认为我们遗漏了一部分,您是在运行 SQL Server 容器,还是 R 容器应该与主机上的 SQL Server 通信?另外:“但是,当我尝试将闪亮的应用程序 docker 化时,它只是无法启动。” - 我们可以看到失败的截图吗?如果您尝试从容器中手动运行 R 程序会发生什么?应用程序不工作还是 docker 无法启动?我敢打赌问题是数据库连接,但仅基于该描述很难确定。可能值得在 R 脚本中添加错误处理。让我们知道您的进展情况

标签: r docker shiny dockerfile odbc


【解决方案1】:

如果它抛出“找不到 ODBC Driver 17 for SQL Server”之类的错误,可能是你的 Dockerfile 中没有安装 ODBC 驱动程序。

我遇到了同样的问题,但将其放入我的 Dockerfile 时解决了:https://community.rstudio.com/t/odbc-drivers-docker/32714。

【讨论】:

    【解决方案2】:

    我仍然认为我们没有足够的信息(我们看不到确认这是 Docker 容器和 SQL Server 之间的连接问题的具体错误消息并不理想),但我会陈述我的假设并试一试。

    您提到您让此堆栈在本地运行没有问题,并且只有当您将 R 应用程序移动到容器中时它才无法工作。这让我认为您的 SQL Server 实例正在本地运行。

    再一次,像server.r 一样很难确定。您已经审查了数据库端点 (Server = 'xxxxxx',)。如果它是一个外部端点,审查它是有意义的,但如果它是一个内部/本地地址,这可能很有用。

    我不熟悉这个堆栈,但从我读到的内容来看,您在 ODBC 方面做了正确的事情 - 您安装了系统包、安装了 R 库并包含了 R 库。看这篇文章好像应该是对的:https://nhsrcommunity.com/blog/sql-server-database-connections-in-r/

    所以,我的理论是,您的服务器配置仍然指向 localhost 或 127.0.0.1,尽管位于 Docker 容器中(它们不再共享相同的环回/本地主机!)。

    所以请尝试将您的server.r 数据库端点更新为Server = 'host.docker.internal',

    我认为这很有可能是问题所在,请参阅此线程以获取有关将 Docker 容器连接到主机服务的更多信息:https://stackoverflow.com/a/24326540/3080207、host.docker.internal 应该可以工作,但我认为这可能取决于在您正在运行的操作系统和正在运行的 Docker 版本上。

    如果我离题了,请提供更多信息:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2016-12-20
      • 2020-09-21
      • 1970-01-01
      • 2017-03-24
      • 2013-07-08
      • 2020-06-16
      相关资源
      最近更新 更多