创建一个crontab专用docker容器

2023-11-05

背景:

K8S的一个POD通过PVC挂在了一个ceph rbd盘,但是希望可以通过脚本定期读取和操作rbd盘里的数据,我们不希望将crontab和app进程放到同一个容器内,并且RBD只支持单个节点的读写挂载,所以没办法通过其它POD来完成这件事。所以方案就是通过sidecar这种形式,在POD里面创建2个容器,一个app容器,一个crontab容器,共享该块rbd盘,然后去执行读取和操作数据。

所以,如何创建一个crontab的docker容器?

1. 首先定义我们的cron格式文件

[root@localhost crontab]# cat sweep-cron
# 需要提供PATH,因为cron bash和系统环境变量不一致
PATH="/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# 配置cron,这里示例每分钟打印hello到/tmp/test.txt文件
*/1 * * * *  echo 'hello' >> /tmp/test.txt
# 注意文件末尾留空行

2.编写dockerfile

# 我们不希望这个容器太重,所以选取了一个简化后的debian:buster镜像,只有几十M
FROM bitnami/minideb:buster

# 考虑到下载速度问题替换了apt源并安装crontab
RUN sed -i 's/deb.debian.org/mirrors.163.com/g' /etc/apt/sources.list && \
    sed -i 's/security.debian.org/mirrors.163.com\/debian-security/g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y --no-install-recommends cron &&\
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean

# 将目录下的cron文件传入容器
COPY sweep-cron /etc/cron.d/sweep-cron

# 启动该cron
RUN crontab /etc/cron.d/sweep-cron

# 启动容器带命令和参数
CMD ["cron", "-f"]

上面有几个点需要留意下:
(1)通过 --no-install-recommends 参数以及 rm -rf /var/lib/apt/lists/*和apt-get clean控制镜像的最终大小;
(2)CMD命令里面 -f 确保了持续运行该容器,即把原来放后端运行的cron放到了前端;
(3)为了控制镜像大小,我们从源头上也做了控制,使用了bitnami的mindeb作为基础镜像。

3.然后构建和执行该容器

#构建
docker build -t cron-container:v1.0 -f dockerfile.yml .

#启动
docker run -d --name mycron cron-container:v1.0

#进入容器查看
docker exec -it mycron bash

root@cb3f2783ca96:/# crontab -l
PATH="/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
*/1 * * * *  echo 'hello' >> /tmp/test.txt
root@cb3f2783ca96:/# service cron status
cron is running.
root@cb3f2783ca96:/# cat /tmp/test.txt 
hello
hello
hello

搞定,然后就是把这个容器放到deployment里面和app容器一同创建并挂载同一块卷就可以了


参考资料:

  1. 如何在 docker 中执行 crontab
  2. 在Docker中运行crontab
  3. Docker cron定时任务
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建一个crontab专用docker容器 的相关文章

随机推荐