无法在docker容器的crontab中运行R脚本

3

我正在尝试在Docker容器内运行一个R脚本。以下是示例。

我的工作目录如下所示。

myRDocker
  -dockerfile
  -scripts
     -save_iris.R

在目录myRDocker中,有一个dockerfile和一个名为scripts的目录,其中包含一个R脚本save_iris.R
我的R脚本save_iris.R如下:
write.csv(iris, '/data/iris.csv')

我的dockerfile如下:

# Install R version 3.6
FROM r-base:3.6.0

#install crontab
RUN apt-get update && apt-get -y install cron

RUN mkdir /data
COPY /scripts  /scripts

我进入了我的目录myRDocker并构建docker镜像。

docker build -t baser .

我在bash中运行Docker容器。

docker run -it baser bash

我进入容器后,进行了以下操作:

crontab -e

然后添加这一行,然后保存。
* * * * * Rscript /scripts/save_iris.R

应该每分钟将文件保存到文件夹/data中。然而,在容器内的data文件夹中我从未找到任何文件。

我的问题是:

  1. 在上述过程中我做错了什么?感觉可能漏掉了什么,但是无法确定原因......

  2. 如果我想在容器启动时运行计划任务应该怎么办。 (比如将计划任务放入一个文件中,并在容器启动时运行...)


也许在crontab下列出“RScript”的完整路径?您想在crontab中运行什么?安排保存鸢尾花似乎效率低下?您是否想要运行docker文件? - NelsonGon
你可能会发现这个有用:https://dev59.com/XVoU5IYBdhLWcg3wcmq8 - NelsonGon
1个回答

4
为什么不在容器运行时启动cronjob,而是在容器启动后运行?此外,我认为在您的情况下cron进程将不会运行,因为您的容器没有做任何事情。尝试这个,它将在容器运行时启动cron并且还会tail cron作业的日志。但请记住,在这种情况下,您的主要进程是“tail -f / var / log / cron.log”,而不是cron进程。
 FROM r-base:3.6.0

 RUN apt-get update &&  apt-get -y install cron

 RUN touch /var/log/cron.log
 COPY hello.r /hello.r
 RUN (crontab -l ; echo "* * * * * Rscript /hello.r  >> /var/log/cron.log") | crontab

# Run the command on container startup
 CMD cron && tail -f /var/log/cron.log

因此,您将在容器标准输出中获得Rscript控制台日志。

hello.r

print("Hello World from R")

enter image description here


谢谢你的帮助!我尝试在Dockerfile中添加RUN cron,但它没有起作用。你的CMD cron可以正常工作。为什么RUN cron不能正常工作呢? - zesla
RUN cron 只在 构建时间 运行,因此您需要一些在 运行时间 运行的东西。 - Adiii
在这种情况下,CMD cronCMD /etc/init.d/cron start似乎无法在运行时启动cron。我需要进入容器中的bash并执行/etc/init.d/cron start,然后cron才能启动。你知道为什么吗?@Adiii - zesla
抱歉,我的意思是在我的情况下。如果您采用帖子中的dockerfile并添加命令行“cmd /etc/init.d/cron start”,构建镜像,在bash中运行容器。我检查过了。Cron没有启动。 - zesla
在bash中,'cmd /etc/init.d/cron start'将启动cron。在我的dockfile中,我应该在cmd后面放什么?我尝试了'cmd cron',但不起作用。我不需要日志。 - zesla
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接