Rstudio через docker не может читать /etc/.odbc.ini, только ~ / .odb c .ini - PullRequest
4 голосов
/ 28 мая 2020

Когда я собираю, а затем запускаю контейнер Docker, который запускает rstudio в Ubuntu, соединение odb c не работает, когда я добавляю файл odb c .ini во время сборки. Однако, если я оставлю файл odb c .ini из сборки и вместо этого добавлю его сам из работающего контейнера, соединение действительно будет работать.

Итак, моя проблема в том, что я пытаюсь получить соединение odb c запускается и запускается из коробки всякий раз, когда этот образ запускается, без дополнительного шага, связанного с необходимостью входа в экземпляр контейнера ubuntu и добавления деталей соединения в файл odb c .ini.

Вот как выглядит файл odb c .ini с фиктивными данными:

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

У меня есть копия этого файла odb c .ini в моем каталоге репо, а затем я включаю это в сборке. My 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, соединение не будет работать, я получаю это сообщение об ошибке:

Ошибка: nanodbc / nanodb c. 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, соединение не работает. Это работает только тогда, когда я вручную добавляю в /home/rstudio/.odbc.ini.

Итак, у меня две проблемы:

  1. Независимо от того, что я попробуйте, я не могу заставить /etc/odbc.ini быть обнаруженным ubuntu для использования в качестве строки подключения odb c. Будь то через Dockerfile или добавив его вручную. Я бы предпочел это, поскольку я хочу, чтобы подключение было доступно для всех, кто использует контейнер.

  2. Я могу получить подключение, когда вручную копирую содержимое odb c .ini выше на /home/rstudio/.odbc.ini, однако, если я попытаюсь сделать это через сборку docker, соединение не будет работать. Я вижу там файл. Он существует со всеми правильными данными, его просто не обнаруживает odb c.

Если актуально:

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

Ответы [ 2 ]

3 голосов
/ 06 июня 2020

Я считаю, что проблема в формате вашего /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 как другой контейнер, но я не думаю, что это актуально, это значения с отступом.)

0 голосов
/ 31 мая 2020

Я не являюсь экспертом в docker, и мне не удалось найти для этого документацию по c. Но из опыта кажется, что каждый раз, когда вы добавляете новый слой (например, используя RUN), любая копия из предыдущих слоев «забывается» (Примечание: это может быть совершенно неверно, если да, пожалуйста, поправьте меня и укажите документацию) .

Итак, я бы попытался объединить ваши 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 технически идет прямо перед оператором, в котором он используется.

...