如何在 MariaDB 容器中运行 cron?

Kir*_*MES 5 docker dockerfile docker-compose

我想在 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
Run Code Online (Sandbox Code Playgroud)

通过其设置,数据库可以正确启动,但“Cron”未初始化。为了使其工作,我必须进入容器并执行“Cron”命令,一切都运行良好。

因此,我正在寻找一种从 docker-compose 中使用的 Dockerfile 启动 db 和 cron 的方法。

如果这不可能,也许还有另一种方法来完成计划的任务?目的是执行数据库的脚本。

fjc*_*fjc 6

详细阐述 @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
Run Code Online (Sandbox Code Playgroud)

只需将您的 crontab 放入crontab该 Dockerfile 旁边的文件中,您就应该拥有一个可用的 cron 容器。

一个 crontab 文件示例:

* * * * * mysql -h mysql --execute "INSERT INTO database.table VALUES 'v';"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)