【问题标题】:R Docker: Can't connect to local MySQL server through socketR Docker:无法通过套接字连接到本地 MySQL 服务器
【发布时间】:2020-02-29 19:32:42
【问题描述】:

我使用 golem 管道来打包和 dockerize 我的应用程序。

对于初学者,我正在尝试使用 docker 在 windows pc 上本地部署应用程序(也尝试在 linux 上运行它,但遇到了同样的问题)。该应用程序从本地 SQlite 数据库中收集数据,该数据库也在我的电脑上运行(一旦部署在服务器上就会类似)。

当我将应用程序作为一个包运行时,应用程序功能正常。 但是一旦我创建了一个 docker 映像并运行它,应用程序启动但无法连接到我的本地 sql 数据库,返回此错误: 无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2“没有这样的文件或目录”)

与应用程序内部数据库的连接如下所示:

    con =  dbConnect(RMariaDB::MariaDB(), dbname = "training_dash_db", user = "root", password = "", host = '127.0.0.1')

我的 docker 文件如下所示:

FROM rocker/tidyverse:3.5.3
RUN R -e 'install.packages("remotes")'
RUN R -e 'remotes::install_github("r-lib/remotes", ref = "97bbf81")'
RUN R -e 'remotes::install_cran("shiny")'
RUN R -e 'remotes::install_github("Thinkr-open/golem")'
RUN R -e 'remotes::install_cran("processx")'
RUN R -e 'remotes::install_cran("attempt")'
RUN R -e 'remotes::install_cran("DT")'
RUN R -e 'remotes::install_cran("glue")'
RUN R -e 'remotes::install_cran("htmltools")'
RUN R -e 'remotes::install_cran("shinydashboard")'
RUN R -e 'remotes::install_cran("shinydashboardPlus")'
RUN R -e 'remotes::install_cran("lubridate")'
RUN R -e 'remotes::install_cran("dplyr")'
RUN R -e 'remotes::install_cran("purrr")'
RUN R -e 'remotes::install_cran("plotly")'
RUN R -e 'remotes::install_cran("DBI")'
RUN R -e 'remotes::install_cran("tibbletime")'
RUN R -e 'remotes::install_cran("tsibble")'
RUN R -e 'remotes::install_cran("shinyWidgets")'
RUN R -e 'remotes::install_cran("leaflet")'
RUN R -e 'remotes::install_cran("pool")'
RUN R -e 'remotes::install_cran("RMariaDB")'
RUN R -e 'remotes::install_cran("roxygen2")'
COPY K2dashboard_*.tar.gz /app.tar.gz
RUN R -e 'remotes::install_local("/app.tar.gz")'
EXPOSE 80
EXPOSE 3306
CMD R -e "options('shiny.port'=80,shiny.host='0.0.0.0');K2dashboard::run_app()"

谢谢。

【问题讨论】:

    标签: mysql r docker shiny golem


    【解决方案1】:

    以下是我可以看到的问题:

    • 您正在使用 127.0.0.1 作为数据库的主机。一旦进入容器,此地址指的是容器的内部 IP,而不是来自您的主机/另一个容器的地址。因此您的应用无法访问主机数据库。

    • 您尚未在容器中安装 MariaDB 驱动程序

    以下是解决方案:

    【讨论】:

    • 谢谢科林。您是 R 部署的 Hadley Wickham :)。我会选择你建议的管道。还有两个问题: 1. 那么在生产中是否建议对 R 进行 dockerizing sql 数据库?我可以去任何一种方式,只要我能看到。一开始我想避免它,因为这似乎是不必要的开销。 2. 我用 r-db 代替 rocker/tidyverse 吗?我错过了使用它的东西吗?再次感谢!
    • 另外,r-db 标签可能存在一些问题。 docker pull 导致:来自守护进程的错误响应:colinfay/r-db 的清单:未找到最新的清单:清单未知:清单未知。指定到最新不会削减它。
    • 我会说是的,对 SQL 数据库进行 docker 化在生产环境中可能是最好的,但这在很大程度上取决于上下文(例如,如果数据库已经存在,您将插入这个,而不是在一个新的 docker 容器上)。如果您是从头开始部署环境,是的,最好选择 dockerized 解决方案(更易于安装和维护)。请注意,您必须在主机和 docker 之间共享一个卷以实现数据持久性。
    • 关于您的其他问题,是的,请使用 r-db insead of rocker/tidyverse。您必须指定版本,现在没有latest(所以docker pull colinfay/r-db:3.6.13.6.0),抱歉文档中没有指定。 cloud.docker.com/repository/docker/colinfay/r-db/tags
    • 在我看来,最好使用 docker compose 来描述 app 和 db 之间的关系(我发现的最简单的例子是 github.com/stavshamir/docker-tutorial )。但是我对mysql与应用程序docker(文件)的使用仍然有点无知。在 docker 文件中仅使用“FROM colinfay/r-db:3.6.1”会导致相同的错误消息“无法通过套接字'/var/run/mysqld/mysqld.sock' (2"无此文件或目录”)”。我希望出现不同的错误。
    猜你喜欢
    • 2019-07-03
    • 2020-11-14
    • 2017-10-07
    • 2018-08-07
    • 1970-01-01
    • 2011-01-12
    • 2017-01-21
    • 2013-03-04
    相关资源
    最近更新 更多