【发布时间】:2016-11-26 13:19:53
【问题描述】:
我使用 supervisor 来运行 cron 和 nginx,问题是当我尝试 COPY 或 VOLUME 挂载我的 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/ 中与 stdout 和 stderr 的 cron 相关的日志是空的。
我还尝试通过 phusion 和 CMD cron -f 剥离主管并自行运行 cron,但同样的问题是,当源是外部的(COPY 或 VOLUME)时它无法正常工作,并且在内部创建时神奇地工作容器。
最初认为这是一个权限问题,并尝试了chmod 644(因为这是在容器中创建的文件所拥有的权限)对COPY 进入结果的所有文件。
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.dls -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 不起作用,但在容器中创建时似乎可以工作。
【问题讨论】:
-
当您将 crontab 文件作为卷导入时,它在容器内的外观如何?
-
@BMitch :在编辑 1 中添加了更多信息。如果您要问的是内容 - 当然是完全相同的。
-
您的主机操作系统是什么?您是否在 Windows 上编辑了 cron 文件?想知道您是否有换行问题。
-
@BMitch :主机操作系统是 Windows - 是的,cronfile 是在 Windows 中创建的。肯定的是,所有 cron 文件的末尾都有一个新行。目前不在 PC 附近,但您认为所有文件上的
dos2unix应该可以解决问题吗? -
我会试试,我测试的文件大小比你的列表小一个字节。
标签: docker cron dockerfile supervisord