我正在寻找关于为我的php fpm容器运行cronjobs的最佳实践。
现在正在运行:
我现在很想有另一个容器运行,名为“Cronjob容器”谁是我的PHP FPM容器(我需要一些PHP的依赖)exec'sa脚本。
所以有三种可能的解
1.)运行一个自己的容器
我很乐意使用这个解决scheme!
如果有一个运行CRON的容器,我可以(以某种方式)在我的php fpm容器上调用docker exec,这将是很好的…或者有其他方法。
2.)在PHP容器内部运行CRON
这样可以,但不是最好的做法。 我可以在运行cron的php fpm容器中启动第二个进程。 这将工作,但我不知道这是谁你应该与docker工作。
3.)运行主机Cron
这将是残酷的。 我需要find给定path的processID和containerID,然后运行docker exec。 但是,这或多或less是我的最后一种方式…我讨厌在没有部署的情况下pipe理cronjob。
那么这里最好的办法是什么?
祝你今天愉快,
巴斯蒂安
我已经编写了一个守护进程,用于观察容器,并在它们的元数据中定义作业(在其元数据中定义)。 这最接近您的解决scheme。 例:
version: '2' services: wordpress: image: wordpress mysql: image: mariadb volumes: - ./database_dumps:/dumps labels: deck-chores.dump.command: sh -c "mysqldump --all-databases > /dumps/dump-$$(date -Idate)" deck-chores.dump.interval: daily
“经典”,类似cron的configuration也是可能的。
这里是文档 ,这里是图像存储库 。
Cron本身可以在前台安装并运行( cron -f ),因此安装在容器中非常容易。 要访问其他容器,你可能会将docker安装在客户端CLI的同一个容器中(而不是运行守护进程)。 然后要访问主机docker环境,最常见的解决方法是绑定docker套接字( -v /var/run/docker.sock:/var/run/docker.sock )。 唯一的问题是你需要在你的容器中设置docker gid来匹配主机gid,然后将容器内的用户添加到docker组中。
这确实意味着这些用户对主机上的任何docker用户具有相同的访问权限,例如root级别的访问权限,因此您需要完全信任提交用户的用户,或者限制可以使用某种sudo等效命令运行的命令。 另一个缺点是,这不便于携带,安全意识pipe理员不太可能批准在他们的系统上运行你的容器。
使用像supervisord这样的工具,回退到选项B是非常容易的。 虽然不是理想的“每个容器一个进程”,但它不是一个反模式,因为它将整个容器和依赖关系保存在一起,并消除了主机的任何安全风险。
无论你是第一个还是第二个选项,都会涉及到你的环境,谁提交工作,有多less个容器需要提交自己的工作等等。如果这是一个pipe理员提交作业,而不是一个容器,那么一个cron容器感。 但是,如果您是应用程序开发人员,需要将您的应用程序作为一个程序包包含在计划作业中,请转到第二个选项。
在另一个容器甚至主机上运行cron,但通过php-fpm运行脚本(例如,cron会“curl”或者PHP脚本)。
确保使用安全令牌,networking限制等来保护这样的设置。增强可以是具有能够产生最多一个进程的dynamic进程的分离的php-fpm池。 这个池只能被cron访问。 它也可以受益于它自己的个人设置,例如更长的执行时间,更多或更less的内存等。
PS:你可以使用这样的东西直接在FPM容器中调用脚本,而不是通过nginx。
推理:你可能想访问相同的库,相同的configuration等。运行一个随机生成的过程,而不是由Docker中的信号pipe理器控制是一个非常糟糕的主意。