Docker不会运行带有外部来源的cron作业文件(host-windows)
我使用主pipe运行cron和nginx,问题是当我尝试COPY
或VOLUME
挂载我的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/
关于stdout
和stderr
cron内的/var/log/supervisor/
是空的。
我也尝试通过phusion和CMD cron -f
自己剥离主pipe和运行cron,但得到了同样的问题,当源是外部的时候( COPY
或VOLUME
)它不工作,并且在容器内部创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
如果它是通过COPY
或VOLUME
创build的,那么它将非常方便,因为每次在容器中手动创build它都是一件麻烦事。
任何帮助将不胜感激!
编辑1:
有关COPY
或VOLUME
后的文件权限的其他信息。
-
当我执行
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
显然COPY
或VOLUME
权限和所有权有很大的不同。 但是,使用确切的权限进行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 ...