Docker 如何在MariaDB容器中运行cron?

Docker 如何在MariaDB容器中运行cron?,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我想基于最新的图像MariaDB,在MariaDB容器中包含一个cron任务,但我一直坚持这一点 我尝试了很多事情都没有成功,因为我不能同时启动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/

我想基于最新的图像
MariaDB
,在MariaDB容器中包含一个cron任务,但我一直坚持这一点

我尝试了很多事情都没有成功,因为我不能同时启动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的方法

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

我建议使用。将此视为了解您的方法不起作用的原因而感到高兴


Docker具有仅在构建期间执行的
RUN
命令。不是在容器启动时

它还有一个执行特定脚本的
CMD
(或入口点)

由于您使用的是CMD,因此:

ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 3306
CMD ["mysqld"]
(您可以在上找到指向实际dockerfles的链接。)

这将告诉docker运行:

docker-entrypoint.sh mysqld
启动时

您必须重写它的
docker entrypoint.sh
,以允许启动cron作业


:

CMD CMD指令有三种形式: CMD[“executable”、“param1”、“param2”](exec格式,这是首选 表单)CMD[“param1”,“param2”](作为入口点的默认参数) CMD命令param1 param2(shell形式)只能有一个CMD Dockerfile中的指令。如果列出多个CMD,则仅 最后一个命令将生效

CMD的主要用途是为正在执行的 容器。这些默认值可以包括可执行文件,也可以省略 可执行文件,在这种情况下,必须指定入口点 指导也是如此

注意:如果使用CMD为入口点提供默认参数 指令,CMD和ENTRYPOINT指令都应 使用JSON数组格式指定

注意:exec表单被解析为JSON数组,这意味着 必须在单词周围使用双引号(“),而不是单引号(')

注意:与shell表单不同,exec表单不调用命令 这意味着正常的shell处理不会发生 例如,CMD[“echo”,“$HOME”]不会对 $HOME。如果需要shell处理,请使用shell窗体或 直接执行shell,例如:CMD[“sh”、“-c”、“echo$HOME” ]。当使用exec表单并直接执行shell时,如 对于shell表单,它是执行环境的shell 变量扩展,而不是docker

在shell或exec格式中使用时,CMD指令设置 运行映像时要执行的命令

如果使用CMD的shell形式,则将执行 在/bin/sh-c中:

来自ubuntu CMD echo的“这是一个测试。”| wc-如果你想运行 如果没有shell,则必须将命令表示为JSON 数组,并给出可执行文件的完整路径。此数组形式是 CMD的首选格式。任何附加参数必须为 在数组中单独表示为字符串:

如果您希望 容器每次运行相同的可执行文件,那么您应该 考虑使用入口点与CMD相结合。参见入口点。< /P> 如果用户指定要docker运行的参数,则它们将重写 CMD中指定的默认值

注意:不要将RUN与CMD混淆。RUN实际上运行一个命令,并且 提交结果;CMD在构建时不执行任何操作,但 指定图像的预期命令


在详细阐述@k0pernikus的评论时,我建议使用一个单独的容器来运行cron

以下是我的做法:

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放入Dockerfile旁边的
crontab
文件中,您就应该有一个工作的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

相关:旁注:我不一定会破坏mariadb容器的功能。而是将它与另一个容器链接,该容器连接到运行脚本的数据库,以更好地分离关注点。我已经尝试过了,但问题是cron正在前台运行,而mariadb不再运行。我会也希望避免第二种解决方案,但如果它是最好的,那为什么不呢!你有我可以参考的链接吗?非常感谢可能重复的好,然后使用一个单独的容器,不干扰数据库容器所有权利,它的工作!非常感谢!我刚刚不得不在“cron”上安装mysql但是现在,我想运行一个“py”脚本,或者最坏的是“sh”,位于Cron容器中的Mariadb容器上。我如何做到这一点?我正在尝试SSH访问,但暂时没有成功…这是什么类型的脚本?脚本是否只访问MySQL数据,这就是它从MySQL容器中需要的所有内容?如果是,您可以通过添加另一个运行行来安装python或任何其他依赖项。在如果您想使用alpine作为基本映像并安装python 3,您需要添加一行
运行apk add python3
。如果您的基本映像使用另一个包管理器,或者您想安装其他包,请相应地进行调整。还可以包含
depens_on
语句,以便msyql在cron包含之前启动r、 或者为了确保容器准备就绪,有一个。我有<代码