我想在 MariaDB 容器中包含一个 cron 任务,基于最新的镜像 mariadb
,但我坚持这一点。
我尝试了很多事情都没有成功,因为我无法同时启动 MariaDB 和 Cron。
这是我的实际 dockerfile:
FROM mariadb:10.3
# DB settings
ENV MYSQL_DATABASE=beurre \
MYSQL_ROOT_PASSWORD=beurette
COPY ./data /docker-entrypoint-initdb.d
COPY ./keys/keys.enc home/mdb/
COPY ./config/encryption.cnf /etc/mysql/conf.d/encryption.cnf
# Installations
RUN apt-get update && apt-get -y install python cron
# Cron
RUN touch /etc/cron.d/bp-cron
RUN printf '* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1\n#' >> /etc/cron.d/bp-cron
RUN touch /var/log/cron.log
RUN chmod 0644 /etc/cron.d/bp-cron
RUN cron
使用其设置,数据库可以正确启动,但“Cron”未初始化。为了使它工作,我必须进入容器并执行“Cron”命令,一切正常。
所以我正在寻找一种方法来从我的 docker-compose 中使用的 Dockerfile 启动 db 和 cron。
如果这是不可能的,也许有另一种方法来完成计划中的任务?目的是执行数据库的脚本。
最佳答案
详细说明@k0pernikus 的评论,我建议使用运行 cron 的单独容器。然后该容器中的 cronjobs 可以与您的 mysql 数据库一起使用。
这是我将如何处理它:
1. 创建一个 Cron Docker 容器
您可以相当简单地设置一个 cron 容器。这是一个应该完成这项工作的 Dockerfile 示例:
FROM alpine
COPY ./crontab /etc/crontab
RUN crontab /etc/crontab
RUN touch /var/log/cron.log
CMD crond -f
只需将您的 crontab 放入
crontab
Dockerfile 旁边的文件,你应该有一个工作的 cron 容器。crontab 文件示例:
* * * * * mysql -h mysql --execute "INSERT INTO database.table VALUES 'v';"
2. 将 cron 容器作为服务添加到您的 docker-compose.yml
确保将 cron 容器添加到 docker-compose.yml,并将其放在与 mysql 服务相同的网络中:
networks:
my_network:
services:
mysql:
image: mariadb
networks:
- my_network
cron:
image: my_cron
depends_on:
- mysql
build:
context: ./path/to/my/cron-docker-folder
networks:
- my_network
关于docker - 如何在 MariaDB 容器中运行 cron?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56803812/