我正在尝试在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
中。但是,我从未在容器内的数据文件夹中找到任何文件。
我的问题是:
我在上述过程中做错了什么?我觉得我可能会遗漏一些东西。。。。。。。
如果我想在容器启动时运行计划的cron任务,该怎么办。 (就像将cron任务放在文件中,然后在容器启动时运行...。)
答案 0 :(得分:2)
为什么不在容器运行时启动cronjob,而不是在容器启动后运行?另外,我不认为crontab进程会在您的情况下运行,因为您的容器没有执行任何操作。
尝试此操作,它将在容器运行时开始cron
,并且还会尾随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控制台日志发送到Container stdout。
hello.r
print("Hello World from R")