Docker 不 运行 具有外部来源的 cron 作业文件(主机 - windows)

Docker does not run cron job files with external origin (host - windows)

我使用主管来 运行 cron 和 nginx,问题是当我尝试 COPYVOLUME 挂载我的 cron 文件时,它没有 运行 我的/etc/cron.d

中的 cron 文件

但是当我 exec -it <container_id> bash 进入容器并从内部创建完全相同的 cron 文件时,它会立即被识别并且 运行 应该是这样。

Docker 文件:

FROM phusion/baseimage:latest

ENV TERM xterm
ENV HOME /root

RUN apt-get update && apt-get install -y \
    nginx \
    supervisor \
    curl \
    nano \
    net-tools

RUN rm -rf /etc/nginx/*
COPY nginx_conf /etc/nginx

COPY supervisor_conf /etc/supervisor/
RUN mkdir -p /var/log/supervisor

COPY crontabs /etc/cron.d/
RUN chmod -R 644 /etc/cron.d/

CMD /usr/bin/supervisord

cron 本身

* * * * * root curl --silent http://127.0.0.1/cronjob/cron_test_docker.php >> /var/www/html/log/docker_test.log 2>&1

cron 和 nginx 运行 通过 supervisor

[supervisord]
nodaemon = true

[program:nginx]
command = /usr/sbin/nginx -g "daemon off;"
autostart = true

[program:cron]
command = /usr/sbin/cron -f
autostart = true

/var/log/supervisor/ 中与 stdoutstderr 的 cron 相关的日志是空的。

我也尝试通过 phusion 和 CMD cron -f 单独剥离主管和 运行ning cron 但遇到了同样的问题,当源是外部时它不起作用(COPYVOLUME) 并在容器内创建时神奇地工作。

最初认为这是一个权限问题,并尝试 chmod 644(因为这是在容器中创建的文件所具有的权限)对 COPY 生成的所有文件进行了尝试。

RUN chmod 644 /etc/cron.d/

之后尝试了所有可能的权限与 rwx 的组合都无济于事。

此外,尝试将 cronjob 行附加到 /etc/crontab,但在 crontab -l 中无法识别。

COPY crontab /tmp/crontab
RUN cat crontab >> /etc/crontab

如果它在通过 COPYVOLUME 创建时就可以工作,那将非常方便,因为每次都在容器中手动创建它很麻烦。

如有任何帮助,我们将不胜感激!

编辑 1 :

关于 COPYVOLUME 后的文件权限的一些附加信息。

显然在制作 COPYVOLUME 时存在非常不同的权限和所有权。但是制作具有确切权限的 COPY 不起作用,但在容器中创建时似乎起作用。

您是否尝试过将 crontab 作为单独的命令安装在 Dockerfile 中?

...
COPY crontabs /path/to/crontab.txt
RUN crontab -u myUser /path/to/crontab.txt
...

感谢@BMitch 能够找到与行尾相关的问题,因为我的主机是 windows 并且 cron 文件源也是 windows行结尾因此 cron 没有自动拾取它。

我将此行添加到我的 Dockerfile 中,效果非常好

RUN find /etc/cron.d/ -type f -print0 | xargs -0 dos2unix

并且在dos2unix为运行的情况下迭代文件的大小确实小了1个字节,因此您可以验证是否确实发生了此操作。

-rw-r--r-- 1 root root 117 Jul 25 08:33 wwwcron-cron-docker_test