首页 > 解决方案 > 通过 docker 的 Rstudio 无法读取 /etc/.odbc.ini,只能读取 ~/.odbc.ini

问题描述

当我构建然后运行在 Ubuntu 上运行 rstudio 的 Docker 容器时,当我在构建期间添加 odbc.ini 文件时,odbc 连接不起作用。但是,如果我从构建中省略 odbc.ini 文件,而是自己从正在运行的容器中添加它,则连接确实有效。

所以我的问题是,每当运行此映像时,我都会尝试启动 odbc 连接并立即运行,而无需登录到 ubuntu 容器实例并将连接详细信息添加到 odbc.ini 文件的额外步骤。

这是 odbc.ini 文件的样子,带有虚拟数据:

[PostgreSQL ANSI]
    Driver              = PostgreSQL ANSI
    Database            = GoogleData
    Servername          = somename.postgres.database.azure.com
    UserName            = docker_rstudio@somename
    Password            = abc123abc
    Port                = 5432
    sslmode             = require

我在我的 repo 目录中有这个文件 odbc.ini 的副本,然后将其包含在构建中。我的 Docker 文件。

FROM rocker/tidyverse:3.6.3
ENV ADD=SHINY
ENV ROOT=TRUE
ENV PASSWORD='abc123'
RUN apt-get update && apt-get install -y \
   less \
   vim  \
   unixodbc unixodbc-dev \
   odbc-postgresql
ADD odbc.ini /etc/odbc.ini
ADD install_packages.R /tmp/install_packages.R
RUN Rscript /tmp/install_packages.R && rm -R /tmp/*
ADD flagship_ecommerce /home/rstudio/blah/zprojects/flagship_ecommerce
ADD commission_junction /home/rstudio/blah/zprojects/commission_junction
RUN mkdir /srv/shiny-server; ln -s /home/rstudio/blah/zprojects/ /srv/shiny-server/

如果我随后通过 rstudio 登录到实例,则连接不起作用,我会收到以下错误消息:

错误:nanodbc/nanodbc.cpp:983:00000:无法连接到服务器:没有这样的文件或目录服务器是否在本地运行并接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接?

如果我看一下文件,less /etc/odbc.ini我确实会看到每个顶部代码块的连接详细信息。

如果我然后将其复制到家中,cp /etc/odbc.ini /home/rstudio/.odbc.ini那么在那之后,我的连接就会起作用。

但是,即使我用 修改我的 dockerfile ADD odbc.ini /home/rstudio/.odbc.ini,连接也不起作用。它仅在我手动添加到 /home/rstudio/.odbc.ini 时才有效。

所以我的问题有两个:

  1. 无论我尝试什么,我都无法让 ubuntu 检测到 /etc/odbc.ini 以用作 odbc 连接字符串。无论是通过 Dockerfile 还是手动添加它。我更喜欢这个,因为我想连接到任何使用容器的人。

  2. 当我手动将上面的 odbc.ini 中的内容复制到时,我能够获得连接,/home/rstudio/.odbc.ini但是如果我尝试通过 docker build 执行此操作,则连接不起作用。我确实在那里看到了文件。它与所有正确的数据一起存在,只是没有被 odbc 检测到。

如果它是相关的:

odbcinst -j
unixODBC 2.3.6
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/rstudio/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

标签: rdockerodbcunixodbc

解决方案


我相信问题出您的/etc/odbc.ini. 我没有你所有的脚本,但这是Dockerfile我使用的:

FROM rocker/tidyverse:3.6.3
ENV ADD=SHINY
ENV ROOT=TRUE
ENV PASSWORD='abc123'
RUN apt-get update && apt-get install -y \
   less \
   vim  \
   unixodbc unixodbc-dev \
   odbc-postgresql
RUN Rscript -e 'install.packages(c("DBI","odbc"))'
ADD ./odbc.ini /etc/odbc.ini

如果我使用odbc.ini这个:

[mydb]
    Driver              = PostgreSQL ANSI
    ServerName          = 127.0.0.1
    UserName            = postgres
    Password            = mysecretpassword
    Port                = 35432

我看到了这个(docker build 和 R 启动消息被截断):

$ docker build -t quux2 .
$ docker run --net='host' -it --rm quux2 bash
> con <- DBI::dbConnect(odbc::odbc(), "mydb")
Error: nanodbc/nanodbc.cpp:983: 00000: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

当我将文件的缩进更改为:

[mydb]
Driver              = PostgreSQL ANSI
ServerName          = 127.0.0.1
UserName            = postgres
Password            = mysecretpassword
Port                = 35432

我看到这个:

$ docker build -t quux3 .
$ docker run --net='host' -it --rm quux3 bash
> con <- DBI::dbConnect(odbc::odbc(), "mydb")
> DBI::dbGetQuery(con, "select 1 as a")
  a
1 1

(对于这个演示,我postgres:11作为另一个容器运行,但我认为这无关紧要,它是缩进的值。)


推荐阅读