因此,我的问题是每当运行这个镜像时,我都希望能够直接启动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
我在我的代码库目录下有一个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
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: 无法连接到服务器: 没有这样的文件或目录 服务器正在本地运行并接受连接吗? 连接Unix域套接字“/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
修改了dockerfile,连接也不起作用。只有当我手动添加到/home/rstudio/.odbc.ini时,它才能工作。
所以我的问题有两个方面:
无论我尝试什么,我都不能使ubuntu检测到/etc/odbc.ini以用作odbc连接字符串。无论是通过Dockerfile还是手动添加。我希望这样做,因为我希望连接对使用容器的任何人都可用。
我能够手动将上面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
/etc/odbc.ini
和~/.odbc.ini
的文件所有权,确保它们属于当前运行的用户(可以由Dockerfile
定义)和/或模式 644。 - r2evans