我使用supervisor来运行cron和nginx,问题是当我尝试COPY
或VOLUME
装载我的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/
内部与stdout
和stderr
的cron相关的日志为空。
我还尝试剥离supervisor,并通过phusion和CMD cron -f
单独运行cron,但遇到了同样的问题,即当源是外部的(COPY
或VOLUME
)时,它不起作用,而当在容器内创建时,它神奇地起作用。
最初认为这是一个权限问题,并尝试对COPY
进入的所有文件使用chmod 644
(因为这是在容器中创建的文件所具有的权限)。
RUN chmod 644 /etc/cron.d/
之后,尝试了rwx
的所有可能的权限组合,但都没有成功。
此外,尝试将cronjob的行附加到/etc/crontab
中,但在crontab -l
中无法识别。
COPY crontab /tmp/crontab
RUN cat crontab >> /etc/crontab
如果它只在通过COPY
或VOLUME
创建时工作,那将非常方便,因为每次在容器中手动创建它都很麻烦。
如有任何帮助,我们将不胜感激!
编辑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
到VOLUME
装载文件夹时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
显然,在制作COPY
或VOLUME
时有非常不同的权限和所有权。但是,使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
...