Ubuntuでrstudioを実行するDockerコンテナーをビルドして実行すると、ビルド中にodbc.iniファイルを追加してもodbc接続が機能しません。ただし、ビルドからodbc.iniファイルを除外して、代わりに実行中のコンテナー内から自分で追加した場合、接続は実際に機能します。
だから私の問題は、ubuntuコンテナーインスタンスにログインしてodbc.iniファイルに接続の詳細を追加する追加の手順なしで、このイメージが実行されるたびにodbc接続を確立してすぐに実行しようとしていることです。
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のコピーをrepoディレクトリに置いて、ビルドに含めます。私の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/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に手動で追加した場合にのみ機能します。
だから私の問題は2つあります:
何を試しても、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
私はDockerの専門家ではなく、これに関する特定のドキュメントを見つけることができませんでした。しかし、経験上、新しいレイヤーを追加するたびに(例: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
は技術的にはそれが使用されるステートメントの直前に来ることに注意してください。