r - 通过 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 时才有效。
所以我的问题有两个:
无论我尝试什么,我都无法让 ubuntu 检测到 /etc/odbc.ini 以用作 odbc 连接字符串。无论是通过 Dockerfile 还是手动添加它。我更喜欢这个,因为我想连接到任何使用容器的人。
当我手动将上面的 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
解决方案
我相信问题出在您的/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
作为另一个容器运行,但我认为这无关紧要,它是缩进的值。)
推荐阅读
- c - 使用 getchar() 清除 Stdin 后输入的换行问题 [已解决]
- python - 如何选择/过滤具有空列表的 Pandas 列?
- django - Django 将 ForeignKey 保存为字符而不是整数字段
- python - 使用 FLD 中的最高特征值为 2D 数据投影多个集群
- r - 使用 r 中的配置文件将每周值分解为每日值
- javascript - 如何在提交时验证表单?
- reactjs - 初始化前无法访问“authReducer”
- php - preg_match - 忽略可选括号
- python - 过滤 Numpy 的数组数组
- office-js - office-addin 未从 nodejs spdy 服务器加载,从本地 nodejs 运行正常,快速服务器