同一容器中的Cron在本地工作但在集群中失败

时间:2017-05-02 14:32:14

标签: docker cron kubernetes google-kubernetes-engine

我有一个安装了cron的超级简单容器:

www2

alive.sh:

implode

我在本地构建了docker镜像并运行它:

* * * * * root /bin/bash /alive.sh

大约一分钟后,我可以检查是否正在创建新文件:

#!/bin/bash

/bin/echo "I'm alive"
/bin/echo $(/bin/date) >> /tmp/alive.log

我标记并将图像推送到Google容器注册表:

docker build -t orian/crondemo:v0 .
docker run --rm -it --name crondemo orian/crondemo:v0

手动启动吊舱:

docker exec crondemo ls /tmp

验证它是否有效:

TAG=eu.gcr.io/<PROJECT_ID>/crondemo:v0
docker tag orian/crondemo:v0 $TAG
kubectl docker -- push $TAG

这是一个问题,没有写入kubectl run crondemo --image=$TAG --replicas=1 --restart=Never 文件。问题在哪里?

我准备了一个带样本的回购:https://github.com/orian/k8s-cron-demo

注意

  • 我还测试过覆盖kubectl exec crondemo ls /tmp ,但它没有解决问题。
  • 我使用的是docker image:/tmp/alive.log。在切换之前,我使用了/var/spool/cron/crontabs/rootopenjdk:8-jre。它似乎工作了。

Edit2 - 发现(这很疯狂):

1 个答案:

答案 0 :(得分:3)

我在启用日志时已经跟https://stackoverflow.com/a/21928878/436754

正在运行:/var/log/syslog

May  4 12:33:05 crondemo rsyslogd: [origin software="rsyslogd" swVersion="8.4.2" x-pid="14" x-info="http://www.rsyslog.com"] start
May  4 12:33:05 crondemo rsyslogd: imklog: cannot open kernel log(/proc/kmsg): Operation not permitted.
May  4 12:33:05 crondemo rsyslogd-2145: activation of module imklog failed [try http://www.rsyslog.com/e/2145 ]
May  4 12:33:08 crondemo cron[38]: (CRON) INFO (pidfile fd = 3)
May  4 12:33:08 crondemo cron[39]: (CRON) STARTUP (fork ok)
May  4 12:33:08 crondemo cron[39]: (*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab)
May  4 12:33:08 crondemo cron[39]: (*system*crondemo) NUMBER OF HARD LINKS > 1 (/etc/cron.d/crondemo)
May  4 12:33:08 crondemo cron[39]: (CRON) INFO (Running @reboot jobs)
May  4 12:34:01 crondemo cron[39]: (*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab)
May  4 12:34:01 crondemo cron[39]: (*system*crondemo) NUMBER OF HARD LINKS > 1 (/etc/cron.d/crondemo)

这使我成为cron "NUMBER OF HARD LINKS > 1"的Google,我发现:https://github.com/phusion/baseimage-docker/issues/198

解决方法是修改Dockerfile以覆盖启动时的cron文件,而不是由Docker挂载。

  • Dockerfile COPY cronfile /cronfile
  • docker-entrypoint.shcp /cronfile /etc/cron.d/crondemo

具有解决方法的分支:https://github.com/orian/k8s-cron-demo/tree/with-rsyslog