Docker 不 运行 具有外部来源的 cron 作业文件(主机 - windows)
Docker does not run cron job files with external origin (host - windows)
我使用主管来 运行 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
单独剥离主管和 运行ning 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.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
不起作用,但在容器中创建时似乎起作用。
您是否尝试过将 crontab 作为单独的命令安装在 Dockerfile 中?
即
...
COPY crontabs /path/to/crontab.txt
RUN crontab -u myUser /path/to/crontab.txt
...
感谢@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
我使用主管来 运行 cron 和 nginx,问题是当我尝试 COPY
或 VOLUME
挂载我的 cron 文件时,它没有 运行 我的/etc/cron.d
但是当我 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
单独剥离主管和 运行ning 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.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
不起作用,但在容器中创建时似乎起作用。
您是否尝试过将 crontab 作为单独的命令安装在 Dockerfile 中?
即
...
COPY crontabs /path/to/crontab.txt
RUN crontab -u myUser /path/to/crontab.txt
...
感谢@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