【问题标题】:Should I separate cron into its own docker container?我应该将 cron 分离到它自己的 docker 容器中吗?
【发布时间】:2019-10-30 08:38:31
【问题描述】:

假设我有一个带有 Nginx 或 PostgresQL 的 Docker 容器。我需要 Cron 来删除旧的日志文件。我应该在哪里运行 cron?在入口点脚本内的同一个容器中?在其 onw 容器中?在码头外?

在 Docker 外部运行会破坏 Docker 对配置的控制。我将不得不使用其他一些配置管理系统来固定它的配置。

【问题讨论】:

  • docker 容器不应保留任何持久性数据。将 nginx 设置为将日志流式传输到标准输出

标签: docker cron


【解决方案1】:

我认为您可能需要重新考虑为什么您实际上需要 cron 工作。 为什么你的容器中有旧的日志文件?在容器内构建应用程序的最佳实践之一是将所有内容记录到 stdout/stderr 中。这样您就可以保持 1 个容器 = 1 个进程的范式,并且您的日志管理是 docker 和/或您的主机的责任。

你可以很容易地做到这一点:

  • 重新配置您的应用程序以记录到 /dev/stdout
  • 将应用程序日志文件 /var/log/nginx/access.log 链接到 dockerfile 中的 /dev/stdout
ln -sf /dev/stdout /var/log/nginx/access.log
ln -sf /dev/stderr /var/log/nginx/error.log

如果您确实需要登录到容器内的某个位置,一个好的做法可能是登录到共享卷。然后运行一个 cron 作业,该作业启动一个容器,该容器也安装此卷并清理日志。您可以使用 cron 作业安排此清理容器。

如果您使用某种编排器(如 Kubernetes),则可以使用 Scheduled pod 来完成此操作。

【讨论】:

  • 1 个容器 = 1 个流程范式有理由应用。我发现它们列在这里:devops.stackexchange.com/questions/447/… 但是我看不出这些原因是如何在这里应用的。 Cron 作业可能不容易与主服务解耦
  • 一个相关的问题是我是否应该在与 Nginx 不同的容器中运行 Certbot。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2012-03-28
  • 1970-01-01
  • 2014-08-12
  • 2010-10-06
  • 2010-10-24
相关资源
最近更新 更多