mysql - 从在相同或不同容器中运行的 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)
有没有更简单的方法来做到这一点?
解决方案
通过首先遵循@r2evans 的建议并使用“docker exec ...”命令,然后通过在“[mysqld]”行之后添加“skip-grant-tables”来解决“访问被拒绝”错误,该问题已得到解决在 /etc/my_mysqlForDocker.cnf 文件中。
推荐阅读
- python - 使用python导入不同的文件
- windows - 批量比较 2 个数字时输出错误
- ruby - Docker,无法启动容器
- javascript - 方法名与 JS 中的属性名不冲突
- windows - 将所有用户的 ini 配置文件放在 %appdata% 中
- unity3d - IAP 服务未初始化:没有 MonoBehaviour 的 IStoreListener,可能吗?
- c# - 是否有简单的机制可以在.net 中将属性保留一段有限的时间?
- java - 生成的 java 文件中的第 [14] 行出现错误:只能导入一个类型。sito.progettoweb 解析为一个包
- javascript - Meteor.js RangeError:超出最大调用堆栈大小
- reactjs - 如何测试需要父组件功能的组件单击?