docker - 如何在 MariaDB 容器中运行 cron?

标签 docker docker-compose dockerfile

我想在 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/

相关文章:

linux - Docker-compose - 设备上没有剩余空间

django - docker 组成,Django : role "_" does not exist

docker - 有没有办法看到完整的 Docker 镜像继承?

Docker:通过参数共享私钥

docker - ADD 和 COPY 将目录的内容与构建中已有的内容合并

docker - 调用时将参数传递给docker-compose yml

windows - 在Windows上运行docker镜像,结果为 “oci runtime error: exec: ” bash“:$ PATH中找不到可执行文件。”

php - Nginx fastcgi 始终在响应中包含请求正文

docker - 如何将文件从服务器复制到Docker容器

Dockerized Vue 应用程序 - 热重载不起作用