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



我使用supervisor来运行cron和nginx,问题是当我尝试COPYVOLUME装载我的cron文件时,它不会在/etc/cron.d 中运行我的cron文件

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

Dockerfile:

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通过监管者运行

[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相关的日志为空。

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

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

RUN chmod 644 /etc/cron.d/

之后,尝试了rwx的所有可能的权限组合,但都没有成功。

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

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

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

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

编辑1:

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

  • 当我执行时

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

    运行ls -l的容器内部/etc/cron.d/显示

    -rw-r--r-- 1 root root 118 Jul 20 11:03 wwwcron-cron-docker_test
    
  • 当我通过docker-composeVOLUME 装载文件夹时

    volumes:
        - ./server/crontabs:/etc/cron.d
    

    ls -l显示

    -rwxrwxrwx 1 1000 staff 118 Jul 20 11:03 wwwcron-cron-docker_test
    
  • 此外,如果我在容器中手动创建cron文件,它看起来是这样的,并且这是

    -rw-r--r-- 1 root root 118 Jul 22 15:50 wwwcron-cron-docker_test_inside_docker
    

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

感谢@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

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

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

最新更新