首页 > 解决方案 > 运行 cron 作业以在 docker mysql 容器中导入许多 csv 文件

问题描述

我的数据库在 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

标签: mysqldockercrondocker-composesh

解决方案


在单个 docker 容器中运行多个进程通常是一种不好的做法。(如果你真的感兴趣,可以在docker 文档
中阅读它)

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

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

对于新容器,请查看 Jon Ribeiro 关于如何在 docker 中运行 cron 作业的文章https://jonathas.com/scheduling-tasks-with-cron-on-docker/

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

或者,如果你想在你的主机上运行 cron,你必须将 mysql 容器端口暴露给主机,并连接到它。

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

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

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


推荐阅读