【问题标题】:Docker does not run cron job files with external origin (host - windows)Docker 不运行具有外部来源的 cron 作业文件(主机 - Windows)
【发布时间】: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.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 文件作为卷导入时,它在容器内的外观如何?
  • @BMitch :在编辑 1 中添加了更多信息。如果您要问的是内容 - 当然是完全相同的。
  • 您的主机操作系统是什么?您是否在 Windows 上编辑了 cron 文件?想知道您是否有换行问题。
  • @BMitch :主机操作系统是 Windows - 是的,cronfile 是在 Windows 中创建的。肯定的是,所有 cron 文件的末尾都有一个新行。目前不在 PC 附近,但您认为所有文件上的 dos2unix 应该可以解决问题吗?
  • 我会试试,我测试的文件大小比你的列表小一个字节。

标签: docker cron dockerfile supervisord


【解决方案1】:

感谢@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

【讨论】:

    【解决方案2】:

    您是否尝试将 crontab 作为单独的命令安装在 Dockerfile 中?

    即

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

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 1970-01-01
      • 2017-11-10
      • 2019-10-13
      • 2021-08-24
      • 2019-09-09
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多