【发布时间】:2022-01-27 17:52:22
【问题描述】:
好的,首先我阅读了一些关于这个主题的帖子。这就是我最终得到解决方案的方式。我仍然没有发现我的错误。我也是一个初学者。
这是我的 docker 文件:
FROM conda/miniconda3
WORKDIR /app
RUN apt-get update -y
RUN apt-get install cron -y
RUN apt-get install curl -y
RUN conda update -n base -c defaults conda
RUN conda install mamba -n base -c conda-forge
COPY ./environment.yml ./environment.yml
RUN mamba env create -f environment.yml
# Make RUN commands use the new environment:
SHELL ["conda", "run", "--no-capture-output", "-n", "d2", "/bin/bash", "-c"]
#Setup cron
COPY ./cronjob /etc/cron.d/cronjob
RUN crontab /etc/cron.d/cronjob
RUN chmod 0600 /etc/cron.d/cronjob
RUN touch ./cron.log
COPY ./ ./
RUN ["chmod", "+x", "run.sh"]
ENTRYPOINT ["sh", "run.sh"]
CMD ["cron", "-f"]
我想做什么:
- 运行我的
run.sh(我设法做到了。) - 在我的容器中设置一个 cronjob,该容器定义在一个名为
cronjob的文件中(参见下面的内容)
我的 cronjob 不工作。为什么? 请注意,cron.log 是空的。它永远不会被触发。
crontab -l(在容器内运行)的输出也是:
$ crontab -l
# Updates every 15 minutes.
*/15 * * * * /bin/sh /app/cron.sh >> /app/cron.log 2&>1
定时任务
# Updates every 15 minutes.
*/15 * * * * /bin/sh /app/cron.sh >> /app/cron.log 2&>1
【问题讨论】:
-
首先,你的cronjob命令是错误的。你应该有
2>&1而不是2&>1。第二。运行ls -lh /app/cron.sh以查看您的文件是否被复制。还要确保cron.sh位于您的Dockerfile所在的目录中。 -
一个Docker容器只运行一个命令;如果您同时指定
ENTRYPOINT和CMD,they are combined together,那么您的容器运行的单个命令是sh run.sh cron -f。在一个容器中只运行一个命令通常更容易,这里典型的最佳实践是运行一个单独的 cron 容器。 (考虑将run.sh设为CMD,而不是ENTRYPOINT,使用docker run选项更容易覆盖。) -
@Saeed 1. 好点。我会解决的。 2. 被复制了。 3. 我确认它在同一个目录中。这就是解决办法。谢谢。
-
@DavidMaze 我想我不想覆盖。但是你会在 run.sh 中调用 cron -f 吗?
-
我会运行一个单独的容器。
docker run ... your-image cron -f或使用 Composecommand:非常简单。