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

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

但是,当我exec -it <container_id> bash到容器中,并从内部创build完全相同的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 

克朗本身

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

cron和nginx通过主pipe运行

 [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内的/var/log/supervisor/是空的。

我也尝试通过phusion和CMD cron -f自己剥离主pipe和运行cron,但得到了同样的问题,当源是外部的时候( COPYVOLUME )它不工作,并且在容器内部创build时奇迹般地工作。

最初认为这是一个权限问题,并尝试chmod 644 (因为这是一个文件在容器中创build的权限)在所有文件是COPY的结果。

 RUN chmod 644 /etc/cron.d/ 

之后,尝试每个可能的组合权限与rwx无济于事。

此外,试图将cronjob的行追加到/etc/crontab但在crontab -l不能识别。

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

如果它是通过COPYVOLUME创build的,那么它将非常方便,因为每次在容器中手动创build它都是一件麻烦事。

任何帮助将不胜感激!

编辑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-compose安装文件夹docker-compose通过VOLUME docker-compose

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

    ls -l显示

     -rwxrwxrwx 1 1000 staff 118 Jul 20 11:03 wwwcron-cron-docker_test 
  • 另外,如果我手动创build容器中的cron文件,它看起来像这样,这个工程

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

显然COPYVOLUME权限和所有权有很大的不同。 但是,使用确切的权限进行COPY不起作用,但在容器中创build时似乎工作。

感谢@BMitch能够find与行结尾相关的问题,因为我的主机是windows,cron文件的起源是windows,行结尾也有差异,因此cron没有自动提取。

我将这一行添加到我的Dockerfile ,它的作用就像一个魅力

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

并且重复一遍,当运行dos2unix时,文件的大小确实小了1个字节,所以你可以validation这个操作是否确实发生了。

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

你有没有尝试作为一个单独的命令在Dockerfile中安装crontab?

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