Запустите задание cron для импорта многих CSV-файлов в контейнер MySQL Docker. - PullRequest
0 голосов
/ 02 декабря 2018

Моя база данных работает внутри контейнера Docker, и я хочу загружать данные из CSV-файлов в базу данных каждый час.

Внутри контейнера выполняется этот скрипт идеально вручную, но я не могу запустить задание внутриконтейнер mysql.

#!/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.* 1008 ут *

1 Ответ

0 голосов
/ 02 декабря 2018

Запуск более одного процесса в одном контейнере Docker обычно является плохой практикой.
(вы можете прочитать об этом в документации Docker , если вы действительно заинтересованы)

Вариант 1 - выделенный контейнер для задания cron

Ваш лучший вариант - создать еще один контейнер, который будет выполнять эту работу (конечно, вам нужно будет связать их между собой и убедиться, что на вашем новом компьютере установлен mysql).Docker-контейнер и т. д.)

Для нового контейнера, ознакомьтесь со статьей Джона Рибейро о том, как запускать задания cron в Docker https://jonathas.com/scheduling-tasks-with-cron-on-docker/

Вариант 2 - запуск задания cron на хосте

В качестве альтернативы, если вы хотите запустить cron на своем хосте, вам придется предоставить порты контейнера mysql хосту и подключиться к нему.

Обратите внимание, что mysql на хосте linux будет использоватьсокет unix, если он пытается подключиться к localhost, поэтому используйте mysql --host=localhost --protocol=TCP, как описано в документации mysql 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

...