草庐IT

php - 在容器中运行 cron

coder 2024-05-02 原文

我有一个托管 Symfony 网络应用程序的 php 容器。我需要使用后台脚本并从 crontab 启动它们。只要我使用 root 用户,它似乎就可以工作。但是,当我将用户切换到“www-data”时 - 它停止工作。 我的想法是以用户 www-data 身份运行 php-fpm,并在我进入容器时登录“www-data”。但是可以为 root 用户定义 crontab,因为它允许在命令前加上用户名。

我的入口点文件包含:

#!/bin/bash
npm install
cron &
php-fpm

我的 docker 文件如下所示:

WORKDIR /app

ADD ./entrypoint.sh /entrypoint.sh
RUN chmod 777 /entrypoint.sh

ADD ./crontab.txt /etc/cron.d/hello-cron
RUN chmod 0666 /etc/cron.d/hello-cron
RUN crontab /etc/cron.d/hello-cron
RUN touch /var/log/cron.log

RUN usermod -s /bin/bash www-data

USER www-data
ENTRYPOINT /entrypoint.sh

如果我跳过行,上面的工作

USER www-data

但我想首先启动 cron(对于 root)然后将默认容器用户切换到 www-data...所以我也尝试过:

ENTRYPOINT /entrypoint.sh
USER www-data

但是效果不是很好。 任何帮助将不胜感激:)

最佳答案

我在这种情况下遇到的问题是,当您使用非特权用户运行容器时,您无法启动 cron,因为无法访问 cron.pid 文件。

因此最好的解决方法是设置 SUID对于 cron 二进制文件,它将允许使用您的 www-data 用户以 root 权限运行它。您还应该确保将 cron 设置添加到正确用户的 crontab。

您可以通过以下方式修改您的 Dockerfile:

WORKDIR /app

ADD ./entrypoint.sh /entrypoint.sh
RUN chmod 777 /entrypoint.sh

ADD ./crontab.txt /etc/cron.d/hello-cron
RUN crontab -u www-data /etc/cron.d/hello-cron  # <---- setting crontab for user www-data
RUN chmod u+s /usr/sbin/cron  # <---- setting setuid
RUN touch /var/log/cron.log

RUN usermod -s /bin/bash www-data

USER www-data
ENTRYPOINT /entrypoint.sh

这应该可以正常工作。

关于php - 在容器中运行 cron,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54353250/

有关php - 在容器中运行 cron的更多相关文章

  1. ruby - 如何在 ruby​​ 中运行后台线程? - 2

    我是ruby​​的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp

  2. ruby - 帮助使用 Ruby 中的 "Whenever"gem 来执行 cron 任务 - 2

    我以前没有使用过cron,所以我不能确定我这样做是对的。我想要自动化的任务似乎没有运行。我在终端中执行了这些步骤:sudogeminstall每当切换到应用程序目录无论何时。(这创建了文件schedule.rb)我将此代码添加到schedule.rb:every10.minutesdorunner"User.vote",environment=>"development"endevery:hourdorunner"Digest.rss",:environment=>"development"end我将此代码添加到deploy.rb:after"deploy:symlink","depl

  3. ruby - 在 rake 任务中运行 capybara - 2

    如何在Rake任务中运行Capybara功能?例如:访问('http://google.com')谢谢! 最佳答案 在任务中尝试这样的事情:require'capybara'require'capybara/dsl'Capybara.current_driver=:seleniumBrowser=Class.new{includeCapybara::DSL}page=Browser.new.pagepage.visit("http://www.google.com")puts(page.html)

  4. ruby-on-rails - 如何在 gem 中运行 Rails 应用程序? - 2

    我不确定这种事情是否很常见,但我一直在尝试创建只是Rails应用程序包装器的gem。我的gem将有一个生成器来创建config.ru,但Rails应用程序将位于gem的lib目录中。我需要知道如何“嵌入”Rails应用程序并对其进行配置,以便它可以在gem中运行。例如:$mygemnewprojectmygemcreatedadirectorycalled"project"withthefollowingfiles:project/config.ruproject/widgets/project/foobars/我的gem还将生成一些需要以某种方式添加到Rails的目录,以便我可以从G

  5. ruby - Ruby 脚本如何检测到它正在 irb 中运行? - 2

    我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_

  6. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  7. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  8. ruby - 脚本在命令行中成功执行但不是作为 cron 作业 - 2

    我有一个bash脚本,它运行一个ruby​​脚本来获取我的Twitter提要。##/home/username/twittercron#!/bin/bashcd/home/username/twitterrubytwitter.rbfriends命令行运行成功/home/username/twittercron但是当我尝试将它作为cronjob运行时,它运行了但无法获取提要。##crontab-e*/15*****/home/username/twittercron脚本已经chmod+x。不知道为什么会这样。有什么想法吗? 最佳答案

  9. ruby - 用一个 #!在 Ubuntu 中运行的 ruby​​ 中评论 - 2

    我是编程新手,正在尝试遵循使用#!用ruby评论。我一直收到消息:bash:matz.rb:找不到命令我正在使用这个评论:#!/usr/bin/envruby我试过有和没有后面的空格!以及有和没有环境。当我使用$哪个rubyruby在:/usr/bin/ruby我还进入了操作系统,将所有用户对文件matz.rb的权限更改为rwx,但没有任何效果。是我做错了什么还是我的系统设置不正确? 最佳答案 /usr/bin/env部分没问题。运行时需要为bash提供matz.rb的路径。如果您在matz.rb所在的目录中,请键入“./matz.

  10. ruby - 在 RVM env 的 Ruby cron 作业中找不到 Gem - 2

    我正在尝试在RVM环境中运行10.5的旧PPC机器上运行一个简单的ruby​​脚本。在SO上搜索,我遵循了这个post中选择的答案.这是cron中的结果行:SHELL=/bin/bash00****BASH_ENV=~/.bash_profile&&/bin/bash-c'~/deggy/onlineGW.rb'此命令在用户sam的根目录下的Bash中运行良好。这是我脚本的重要部分:#!/usr/bin/envrubyrequire'open-uri'require'nokogiri'...这是cron的错误输出:X-Cron-Env:X-Cron-Env:X-Cron-Env:X-C

随机推荐