当某个 cron 作业未在某个 docker 容器中执行时,如何调试?

当某个 cron 作业未在某个 docker 容器中执行时,如何调试?

我所做的是:

docker run --rm -it SomeCentOsBasedImage   
(in a docker container)   
yum update -y   
yum install -y vim cronie python3   
vim /script.sh   
   #!/bin/bash   
   echo "a" >> /target.txt   
chmod 777 script.sh   
crontab -e   
   * * * * * /script.sh   
crond -n   
# indented lines should be written in the above file.

但这不起作用。

target.txt未生成 该文件。

我检查了一下crontab -l,结果显示如此* * * * * /script.sh

docker run --rm -it centos:7当我在容器中执行完全相同的操作时,target.txt文件就正确生成了。

我必须调试这个问题,但我所能做的只是检查crontab -l

我还能做些什么呢?

谢谢 :)

+ 我的Dockerfile

FROM centos:7

RUN localedef -c -i en_US -f UTF-8 en_US.UTF-8 && \
        yum update -y
RUN yum install -y python3 cronie vim && \
        pip3 install requests

WORKDIR /app
COPY . /app
COPY crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN /usr/bin/crontab /etc/cron.d/crontab

CMD ["crond", "-n"]

crontab文件:

➜  issue4 git:(feature/issue-4) cat crontab
* * * * * python3 /app/hello.py >> /var/log/cron.log

这样,在/var/log 就会生成一个日志文件。

但是,当我将基本图像更改为扩展图像(FROM Some.Registry.com/centos7)时,不会生成日志。

答案1

通常,cron 根本不在容器内运行。您不应将容器视为虚拟机,尽管它们内部看起来很相似。

通常,容器中只运行一个进程。因此,如果您确实需要 cron,则必须特意安装并启动 crond(cron 守护程序),然后将其添加到启动容器时使用的命令中里面容器。

通常情况下,您会在容器外运行 cron,尽管 cron 命令本身可能会与您的容器交互。

现在,回答你最初的问题 - 不幸的是,没有足够的信息来解释为什么它适用于 centos:7,而使用扩展 centos:7 的映像会失败。你可能在同一个映像的不同容器中安装了 cron,而第二次运行应用程序时,你的修改就丢失了。我只是无法从这里判断。

当您说(in a docker container)这些信息不够时。您是否docker exec进入了已在运行的容器?

不管怎样,尽管你想要的完全有可能实现,但以这种方式去做却是不寻常的。

相关内容