通过 docker 的 Rstudio 无法读取 /etc/.odbc.ini,只能读取 ~/.odbc.ini

Rstudio via docker cannot read /etc/.odbc.ini, only ~/.odbc.ini

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

所以我的问题是,每当此图像为 运行 时,我正在尝试建立 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 登录到实例,则连接不起作用,我收到此错误消息:

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"?

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

如果我随后使用 cp /etc/odbc.ini /home/rstudio/.odbc.ini 复制到家中,那么之后,我的连接就可以正常工作了。

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

时有效

所以我的问题有两个:

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

  2. 当我手动将上面 odbc.ini 中的内容复制到 /home/rstudio/.odbc.ini 时,我能够获得连接,但是如果我尝试通过 docker 构建来执行此操作,连接不起作用。我确实在那里看到了文件。它存在所有正确的数据,只是没有被 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

我不是 docker 方面的专家,也没有找到这方面的具体文档。但根据经验,似乎每次添加新层(例如使用 RUN)时,前一层的任何副本都是 "forgotten"(注意:这可能是完全错误的,如果是这样,请有人纠正我和指定文档)。

所以我会尝试合并您的 RUN 参数并在需要的 RUN 语句之前添加每个文件。由于图层的创建和保存方式,这具有减小最终图像大小的额外好处。

FROM rocker/tidyverse:3.6.3
ENV ADD=SHINY
ENV ROOT=TRUE
ENV PASSWORD='abc123'
#add files (could also combine them into a single tar file and add it. Or add it via git, which is often used)
ADD odbc.ini /etc/odbc.ini
ADD install_packages.R /tmp/install_packages.R
ADD flagship_ecommerce /home/rstudio/blah/zprojects/flagship_ecommerce
ADD commission_junction /home/rstudio/blah/zprojects/commission_junction
#Combine all runs into a single statement
RUN apt-get update && apt-get install -y \
   less \
   vim  \
   unixodbc unixodbc-dev \
   odbc-postgresql \
 && Rscript /tmp/install_packages.R \
 && rm -R /tmp/* \
 && mkdir /srv/shiny-server \
 && ln -s /home/rstudio/blah/zprojects/ /srv/shiny-server/

请注意,现在 add 在技术上恰好位于使用它的语句之前。

我认为问题出在您的 /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 构建和 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 作为另一个容器,但我认为这不相关,它是缩进值。)