运行cron作业以在docker mysql容器中导入许多csv文件

时间:2018-12-02 07:11:57

标签: mysql docker cron docker-compose sh

我的数据库正在docker容器中运行,我想每小时将来自csv文件的数据加载到数据库中

在容器内部,该脚本可以完美地手动运行,但是我无法在mysql容器内启动ron作业。

#!/usr/bin/env bash

cd /import/logs/301
for f in *.csv
do
        mysql -e "LOAD DATA LOCAL INFILE '"$f"' IGNORE INTO TABLE 301 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 2 LINES (@date,@time,R3,R2,R1) SET MeasuringTime = timestamp(str_to_date(@date,'%Y/%m/%d'), @time)" -u USER --password=PASSWORD DATABASE
done

cd /import/logs/302
for f in *.csv
do
        mysql -e "LOAD DATA LOCAL INFILE '"$f"' IGNORE INTO TABLE 302 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 2 LINES (@date,@time,R3,R2,R1) SET MeasuringTime = timestamp(str_to_date(@date,'%Y/%m/%d'), @time)" -u USER --password=PASSWORD DATABASE
done

我更喜欢在主机上运行cron,但是如何?

或者我应该带一个额外的导入容器,如何构建docker-compose.yml

1 个答案:

答案 0 :(得分:0)

在单个Docker容器中运行多个进程通常是一个坏习惯。
(如果您真的有兴趣,可以在docker documentation中进行阅读)

选项1-用于cron作业的专用容器

您最好的选择是创建另一个容器来完成此工作(当然,您必须在它们之间进行链接,并确保在新的Docker容器上安装了mysql等)

对于新容器,请查看乔恩·里贝罗(Jon Ribeiro)关于如何在docker https://jonathas.com/scheduling-tasks-with-cron-on-docker/内运行cron作业的文章

选项2-在主机上运行cron作业

或者,如果要在主机上运行cron,则必须将mysql容器端口公开给主机,然后连接到主机。

请注意,如果Linux主机上的mysql尝试连接到本地主机,它将使用unix套接字,因此请按照mysql文档中的说明使用mysql --host=localhost --protocol=TCP https://dev.mysql.com/doc/refman/5.5/en/connecting.html
从mysql文档中:

  

在Unix上,客户端使用Unix套接字文件进行连接。 --socket选项或MYSQL_UNIX_PORT环境变量可用于指定套接字名称。

     

要强制改为使用TCP / IP连接,请指定--protocol选项:
  shell> mysql --host=localhost --protocol=TCP