Не удалось подключиться к MySql из приложения Shiny-Docker - PullRequest
0 голосов
/ 25 июня 2019

У меня есть Shiny app, который размещен в Ubuntu.Это приложение зависит от данных, которые обновляются каждый день, а обновленные данные хранятся в локальном MySql server.Чтобы получить данные, когда приложение

Statistics_FN = function() {
                    library(RMySQL)
                        mydb1 = RMySQL::dbConnect(MySQL(), user = 'Application', password = 'XXX*', dbname = 'YYY', 
                                                    host = 'localhost', unix.socket = '/run/mysqld/mysqld.sock')
                        Statistics = RMySQL::fetch(dbSendQuery(mydb1, paste("select * from Weekly_Statistics")))

                    dbClearResult(dbListResults(mydb1)[[1]])
                    RMySQL::dbDisconnect(mydb1)
                    detach("package:RMySQL", unload = TRUE)

                    return(Statistics)
                }
                Statistics = Statistics_FN()

Теперь я докертизировал это приложение с помощью файла Docker, указанного ниже:

FROM r-base:3.5.0

RUN apt-get update && apt-get install -y \
    sudo \
    gdebi-core \
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libcairo2-dev/unstable \
    libudunits2-dev \
    libxml2-dev \
    libxt-dev \
    libv8-dev \
    libgdal-dev \
    libssl-dev

RUN wget --no-verbose https://s3.amazonaws.com/rstudio-shiny-server-os-build/ubuntu-12.04/x86_64/VERSION -O "version.txt" && \
    VERSION=$(cat version.txt)  && \
    wget --no-verbose "https://s3.amazonaws.com/rstudio-shiny-server-os-build/ubuntu-12.04/x86_64/shiny-server-$VERSION-amd64.deb" -O ss-latest.deb && \
    gdebi -n ss-latest.deb && \
    rm -f version.txt ss-latest.deb

RUN R -e "install.packages(c('shiny', 'shinydashboard'), repos='http://cran.rstudio.com/')"
RUN R -e "install.packages(c('purrr', 'RMySQL'), repos='http://cran.rstudio.com/', dependencies = TRUE)"

COPY shiny-server.conf  /etc/shiny-server/shiny-server.conf
COPY /Vol_Lab /srv/shiny-server/

COPY shiny-server.sh /usr/bin/shiny-server.sh

CMD ["/usr/bin/shiny-server.sh"]

RUN mkdir /root/app
COPY App /root/app

COPY Rprofile.site /usr/lib/R/etc/

EXPOSE 8383

CMD ["R", "-e", "shiny::runApp('/root/app')"]

Однако при указанной выше конфигурации мне не удалось запустить приложение Dockerized.Когда я проверил docker logs 3655f065c1ed, я вижу ниже строку ошибки

Error in .local(drv, ...) :
  Failed to connect to database: Error: Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)

Я также попытался с host = '127.0.0.1', но не смог.

Может кто-то указывает мнев правильном направлении, как я могу подключиться к локальной базе данных MySql из моего приложения Shiny, содержащегося в Docker?

Измененные файлы server.R и Docker, основанные на ответе Дуй Фана: -

Statistics_FN = function() {
                    library(RMySQL)
                        mydb1 = RMySQL::dbConnect(MySQL(), user = 'Application', password = 'XXX*', dbname = 'YYY', 
                                                    host = 'localhost', port = 3306)
                        Statistics = RMySQL::fetch(dbSendQuery(mydb1, paste("select * from Weekly_Statistics")))

                    dbClearResult(dbListResults(mydb1)[[1]])
                    RMySQL::dbDisconnect(mydb1)
                    detach("package:RMySQL", unload = TRUE)

                    return(Statistics)
                }
                Statistics = Statistics_FN()

Файл Docker -

FROM r-base:3.5.0

RUN apt-get update && apt-get install -y \
    sudo \
    gdebi-core \
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libcairo2-dev/unstable \
    libudunits2-dev \
    libxml2-dev \
    libxt-dev \
    libv8-dev \
    libgdal-dev \
    libssl-dev

RUN wget --no-verbose https://s3.amazonaws.com/rstudio-shiny-server-os-build/ubuntu-12.04/x86_64/VERSION -O "version.txt" && \
    VERSION=$(cat version.txt)  && \
    wget --no-verbose "https://s3.amazonaws.com/rstudio-shiny-server-os-build/ubuntu-12.04/x86_64/shiny-server-$VERSION-amd64.deb" -O ss-latest.deb && \
    gdebi -n ss-latest.deb && \
    rm -f version.txt ss-latest.deb

RUN R -e "install.packages(c('shiny', 'shinydashboard'), repos='http://cran.rstudio.com/')"
RUN R -e "install.packages(c('dplyr', 'tidyr', 'RMySQL'), repos='http://cran.rstudio.com/', dependencies = TRUE)"

COPY shiny-server.conf  /etc/shiny-server/shiny-server.conf
COPY /FinDerivs /srv/shiny-server/

COPY shiny-server.sh /usr/bin/shiny-server.sh

CMD ["/usr/bin/shiny-server.sh"]

RUN mkdir /root/app
COPY App /root/app

COPY Rprofile.site /usr/lib/R/etc/

EXPOSE 7373
EXPOSE 3306

CMD ["R", "-e", "shiny::runApp('/root/app')"]

Я все еще получаю ту же ошибку:

Error in .local(drv, ...) :
  Failed to connect to database: Error: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

** Информация от ** Docker PS ****

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
0266e80a5464        5fe2ba858107        "R -e shiny::runApp(…"   About an hour ago   Up 28 minutes       3306/tcp, 0.0.0.0:7373->7373/tcp   ecstatic_hypatia

1 Ответ

0 голосов
/ 25 июня 2019

Если вы не против подключиться к локальной базе данных MySQL через TCP вместо сокета unix, в приложении замените unix.socket = '/run/mysqld/mysqld.sock' на port = '3306'.

Затем в Dockerfile выставьте также порт MySQL по умолчанию с помощьюEXPOSE 3306.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...