如何解决我的r闪亮应用需要在dockerfile中使用odbc驱动程序
我正在制作一个R Shiny应用程序,该应用程序使用DBI和odbc调用数据库(SQL Server)并显示一个表。我的应用程序可以在本地计算机上完美运行。但是,当我尝试将闪亮的应用程序进行docker化时,它只是无法启动。不知道为什么那行不通。
我觉得我可能需要在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的ODBC驱动程序17”之类的错误,则可能是您尚未在Dockerfile中安装ODBC驱动程序。
我遇到了同样的问题,但是将其放入我的Dockerfile:https://community.rstudio.com/t/odbc-drivers-docker/32714时,它为我解决了。
,我仍然认为我们没有足够的信息(这是不理想的,因为我们看不到具体的错误消息来确认这是Docker容器与SQL Server之间的连接问题),但是我会陈述我的假设并试一试。
您提到,您的堆栈在本地运行时没有问题,仅当您将R应用程序移动到无法使用的容器中时。这使我认为您的SQL Server实例在本地运行。
再一次很难像server.r
中那样确定。您已经检查了数据库端点(Server = 'xxxxxx',
)。如果它是外部端点,则对其进行审查是有意义的,但是,如果它是内部/本地主机地址,则可能会有用。
我不熟悉此堆栈,但据我所读,您在ODBC方面做得正确:您安装了系统软件包,安装了R库,并包括了R库。看这篇文章似乎应该是正确的:https://nhsrcommunity.com/blog/sql-server-database-connections-in-r/
所以,我的理论是,尽管您的服务器配置位于Docker容器中(它们不再共享相同的环回/本地主机!),但仍然指向localhost
或127.0.0.1
。
因此,请尝试将server.r
数据库端点更新为Server = 'host.docker.internal',
我认为这是一个很好的机会,有关将Docker容器连接到主机服务的更多信息,请参阅此线程:https://stackoverflow.com/a/24326540/3080207,host.docker.internal
应该可以,但是我认为这可能取决于您正在运行的操作系统以及您正在运行的Docker版本。
如果我的成绩超出标准,请提供更多信息:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。