首页 > 解决方案 > 从在相同或不同容器中运行的 R 程序持久插入到在容器中运行的 MySQL 数据库

问题描述

我需要运行一个写入 MySQL 数据库的 R 应用程序,它们都运行在我没有管理员权限的远程计算集群上,因此无法在本地安装 MySQL。我的想法是将 R 应用程序放在一个容器中,并在第二个容器中运行 MySQL,数据库在我的文件空间中写入外部卷。然后,启动通过 Docker 网络连接的两个容器,让 R 应用程序与 MySQL 交互并写入我在集群上的磁盘空间。

代码:

script_mysql <- function() {
  library( DBI )
  library( RMySQL )

  conn <- DBI::dbConnect( RMySQL::MySQL(),
                          user='root',
                          password='',
                          host="mysql1",
                          dbname='test' )
  
  query <- paste0( 'insert into test (value) values (5);')
  DBI::dbGetQuery( conn, query )

  print( "Connected" )

}

Dockerfile:

FROM rocker/r-ver:latest

RUN mkdir /home/analysis

COPY script_mysql.R /home/analysis/

CMD R -e "source('/home/analysis/script_mysql.R')"

构建我的 Docker 应用程序:

docker build -t myapp .

创建我的网络:

docker network create my-net

启动 MySQL 容器:

docker run --name=mysql1 \
--mount type=bind,src=/etc/my_mysqlForDocker.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/Users/<my_file_path>/mysql_docker,dst=/var/lib/mysql \
--network=my-net  -d mysql/mysql-server:latest

启动我的 R 容器:

docker run --network=my-net my_app

这运行。我可以看到 MySQL 文件出现在“mysql_docker”目录中的位置。我可以看到 R 在其容器中启动,获取我的文件并无错误地退出。问题是:1)数据库目录中的文件似乎没有更新(因此似乎没有存储任何内容);2)我不知道如何连接到容器中运行的数据库以查看是否有任何变化。我试过了:

docker run -it --network my-net --rm mysql mysql  -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

有没有更简单的方法来做到这一点?

标签: mysqlrdocker

解决方案


通过首先遵循@r2evans 的建议并使用“docker exec ...”命令,然后通过在“[mysqld]”行之后添加“skip-grant-tables”来解决“访问被拒绝”错误,该问题已得到解决在 /etc/my_mysqlForDocker.cnf 文件中。


推荐阅读