使用R和SQL Server驱动程序设置Docker镜像

8

这可能是一个缺乏具体细节的问题,但由于我花了将近两天的时间尝试让它工作,我想我可以试一试:

我正在尝试设置一个Docker镜像,通过R(使用RODBC或odbc)与SQL Server数据库通信。

我遇到的问题似乎是在建立连接时未能安装(或定位)必要的SQL Server驱动程序,当运行以下命令时:

 con <- dbConnect(odbc(),
             Driver = "SQL Server",
             Server = "xxxx",
             Database = "xxxx",
             UID = "xxx",
             PWD = “xxxx")

有人设置过类似的Docker镜像吗?
编辑:
这是我的当前dockerfile(我尝试了多种方法,但这个可以复现错误消息)
    FROM rocker/r-ver:3.5.0

    RUN apt-get -qq update \
        && apt-get -qq dist-upgrade -y \
        && apt-get -qq install git unixodbc unixodbc-dev postgresql-9.5 odbc-postgresql libssl-dev sudo -y

    COPY . /usr/local/src/myscripts
    WORKDIR /usr/local/src/myscripts

    RUN R -e 'install.packages("odbc")'
    RUN R -e 'install.packages("plumber")'

    EXPOSE 8000

    CMD ["Rscript", "plumber.R"]

运行容器并执行ODBC命令的结果如下:

    > library('odbc')
    > con <- dbConnect(odbc(),
    +                    Driver = "SQL Server",
    +                    Server = "xx",
    +                    Database = "xx",
    +                    UID = "xx",
    +                    PWD = "xx")
    Error: nanodbc/nanodbc.cpp:950: 01000: [unixODBC][Driver Manager]Can't open lib 'SQL Server' : file not found

数据库在哪里?是在一个卷中还是外部连接?基本想法是,在您的“Dockerfile”中加载R图像,然后导入任何其他依赖项,如SQL Server驱动程序/连接器。您还必须使DB对Docker容器可见,可以通过卷或打开端口来实现。 - Mako212
你能否编辑你的问题并添加你当前的Dockerfile? - Ortomala Lokni
@OrtomalaLokni - 我已经将Dockerfile添加到问题中。 - Andri Már Stefánsson
@Mako212 - 这将是一个外部连接 - 所以我需要打开一个端口。我知道如何为 plumber API 做到这一点,但还需要学习如何为 SQL 数据库连接做到这一点。 - Andri Már Stefánsson
1个回答

12

在您的 Dockerfile 中,您安装了PostgrSQL的ODBC驱动程序,但没有安装MS SQL server的驱动程序。在需要使用MS SQL的Docker镜像中,我使用了来自Microsoft的驱动程序:

FROM rocker/r-ver:3.5.1

RUN apt-get update \
 && apt-get install --yes --no-install-recommends \
        apt-transport-https \
        curl \
        gnupg \
        unixodbc-dev \
 && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
 && curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list \
 && apt-get update \
 && ACCEPT_EULA=Y apt-get install --yes --no-install-recommends msodbcsql17 \
 && install2.r odbc \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/* \
 && rm -rf /tmp/*

接下来我在R脚本中使用了

con <- odbc::dbConnect(odbc::odbc(),
                 Driver = "ODBC Driver 17 for SQL Server",
                 Server = Sys.getenv("SERVER"),
                 Database = Sys.getenv("DB"),
                 UID = Sys.getenv("USER"),
                 PWD = Sys.getenv("PWD"))

@RalfStaubner 谢谢,我会尝试一下。我尝试过修改这个 - https://gist.github.com/ibombonato/fc88f5d5418e42abf3be3449c9893a01 - 但是没有成功构建这个镜像。 - Andri Már Stefánsson
使用此 Docker 文件构建时,出现以下错误 ERROR: Job failed: command terminated with exit code 1 - Kresten
@atomman 上下文是什么?错误发生在 docker build 还是 docker run 期间?哪个命令触发了错误? - Ralf Stubner
我正在设置一个Docker镜像,用于CI r包。在执行docker build .期间,构建结束了。对我来说,这似乎是一个超时错误。 - Kresten
@atomman 你认为这是超时了吗?哪个命令失败了? - Ralf Stubner
@RalfStubner,您能否帮忙解决关于Snowflake驱动程序的问题?https://dev59.com/bMXsa4cB1Zd3GeqPqq_8 - Karthik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接