カテゴリー
[Node.js & Docker] node-cronをDockerコンテナから使ってスケジュール実行をさせてみる
※ 当ページには【広告/PR】を含む場合があります。
2020/09/06
はじめに
Dockerコンテナの構築
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
$ docker -v
Docker version 19.03.8, build afacb8b7f0
$ docker-compose -v
docker-compose version 1.16.1, build 6d1ac21
プロジェクトのファイル構造の下準備
$ touch Dockerfile docker-compose.yml index.js package.json && mkdir tmp
$ tree
.
├── Dockerfile
├── docker-compose.yml
├── index.js
├── package.json
└── tmp #👈空のフォルダ
Dockerfile
FROM node:12-alpine
ENV NODE_ENV development
WORKDIR /usr/src/app
COPY package.json ./
RUN yarn install && yarn cache clean
CMD ["node", "index.js"]
docker-compose.yml
cron
version: '3'
services:
cron:
image: node-cron-dckr:12-alpine
build: .
container_name: my-node-cron
user: 'node:node'
environment:
NODE_ENV: development
volumes:
- ./:/usr/src/app
tty: true
index.js
* * * * *
tmp
const cron = require('node-cron');
const fs = require("fs");
cron.schedule('* * * * *', () => {
try{
console.log('running a task every minute');
fs.appendFileSync("tmp/file.txt", "Hello Node-Cron!\n");
}
catch(e){
console.log(e.message);
}
});
package.json
{
"name": "node-cron-dckr",
"version": "0.0.1",
"devDependencies": {
"node-cron": "^2.0.0"
}
}
devDependencies
RUN yarn add node-cron -D
イメージのビルド
$ docker-compose build
$ docker images
REPOSITORY TAG IMAGE ID SIZE
node-cron-dckr 12-alpine 76bed01fec57 104MB
Cronのスケジュール文法
* * * * *
cat /etc/crontab
Example of job definition:
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * user-name command to be executed
any
*
* * * * *
* * * * 1:
月曜日限定で毎分実行
10 * * * *:
毎時間、時計の針が10分になったら実行
(..., 8:10, 9:10, 10:10, ...)
20 8 * * *:
毎日午前8時20分になったら実行
コンテナの起動
$ docker-compose run -d cron
tmp
$ cat tmp/file.txt
Hello Node-Cron!
Hello Node-Cron!
Hello Node-Cron!
Hello Node-Cron!
#...以降一分毎に更新
止め方・消し方
docker ps
$ docker ps
CONTAINER ID IMAGE COMMAND STATUS NAMES
0639a40822ed node-cron-dckr:12-alpine "docker-entrypoint.s…" Up nodecrondckr_cron_run_1
<イメージ名>_<サービス名>_run_<起動しているコンテナ数>
#👇コンテナを止める場合
$ docker stop nodecrondckr_cron_run_1
nodecrondckr_cron_run_1
#👇コンテナを消す場合
$ docker rm nodecrondckr_cron_run_1
nodecrondckr_cron_run_1
まとめ
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー