2017-07-05 160 views
1

我在Alpine Linux上運行非root用戶的crontab文件有一段令人討厭的時間。爲什麼crond無法在alpine linux上運行非root crontab?

我經歷過的另外兩個cron的相關帖子,我也沒有答案:

https://askubuntu.com/questions/23009/why-crontab-scripts-are-not-working

https://serverfault.com/questions/449651/why-is-my-crontab-not-working-and-how-can-i-troubleshoot-it

這裏是設置。

我的crontab是這樣的:

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin 
SHELL=/bin/bash 

* * * * * /opt/monitor/monitor.sh >> /var/log/monitor.log 2>&1 
0 3 * * * /opt/monitor/monitor-log-clean.sh >> /var/log/monitor.log 2>&1 

我Dockerfile是有點亂了,但僅僅是因爲我一直拼命解決這個問題。它看起來像這樣。簡而言之,我爲crontab -e添加SUID,以便像其他用戶一樣工作,創建我的用戶,導入我的crontab文件,然後爲所能想到的所有內容提供權限。

FROM alpine:3.5 

# DEPENDENCY TO ALLOW USERS TO RUN crontab -e 
RUN apk add --update busybox-suid 

# I LIKE BASH 
RUN apk --no-cache add bash bash-doc 
RUN apk --no-cache add util-linux pciutils usbutils coreutils binutils findutils grep 

#... lots of custom stuff ...  

# CREATE USER 
RUN adduser -S robuser && \ 
    mkdir -p /home/robuser 

# ADD ENTRY POINT 
ADD src/entrypoint.sh /home/robuser/entrypoint.sh 

# GIVE MY USER ACCESS 
RUN mkdir /etc/cron.d 
RUN echo "robuser" > /etc/cron.allow 
RUN echo "" >> /etc/cron.allow 
RUN chmod -R 644 /etc/cron.d 

# ADD MY CRONTAB 
RUN mkdir -p /var/spool/cron/crontabs 
ADD ./src/crontab.conf /tmp/cloudwatch/crontab.conf 
RUN crontab -u robuser /tmp/cloudwatch/crontab.conf 

# DEBUG... GIVE MY USER ACCESS TO EVERYTHING 
RUN chown -R robuser /etc/cron.d 
RUN chmod -R 755 /etc/cron.d 
RUN chown -R robuser /var/spool/cron 
RUN chmod -R 744 /var/spool/cron 
RUN chown robuser /var/spool/cron/crontabs 
RUN chmod 744 /var/spool/cron/crontabs 
RUN chown -R robuser /etc/crontabs 
RUN chmod -R 744 /etc/crontabs 
RUN chown robuser /etc/crontabs/robuser 
RUN chmod -R 744 /etc/crontabs/robuser 
RUN chmod 600 /var/spool/cron/crontabs/robuser 

# ADD MY MONITORING PROGRAM 
RUN mkdir -p /opt/monitor 
ADD src/monitor /opt/monitor 
RUN mkdir -p /opt/monitor/.tmp && \ 
    chown -R robuser /opt/monitor && \ 
    chmod -R 700 /opt/monitor 

RUN touch /var/log/entrypoint.log && \ 
    touch /var/log/monitor.log && \ 
    touch /var/log/cron.log && \ 
    touch /var/log/awslogs.log && \ 
    chown -R robuser /var/log 

USER robuser 

ENTRYPOINT /home/robuser/entrypoint.sh 

與此同時,我的entrypoint.sh有這個地方。我啓動cron守護程序作爲後臺服務,並以詳細的方式記錄到cron.log。我也試過指定-d 0來獲得更多的調試,但是並沒有真正添加任何東西到輸出中。

#!/bin/bash 

crond -b -l 0 -L /var/log/cron.log 

#... lots of other startup stuff ... 

重要的一點:如果我不切換到robuser一切工作沒關係,根

如果我檢查cron.log,其漂亮的空:

crond: crond (busybox 1.25.1) started, log level 0 
crond: wakeup dt=45 
crond: wakeup dt=60 
crond: wakeup dt=60 

同時,/var/log/monitor.log完全是空的(見的crontab在文章的開頭)。

所以crond不打印任何錯誤。

我試過所有我能想到的來調試這個。沒有錯誤信息。它只是運行,從不打印。一個很好的建議是簡單地我的crontab ..但是這也沒有工作:

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin 
SHELL=/bin/bash 

* * * * * touch /tmp/test.txt 

我試圖尋找誰使用非root的cron等高山容器,但大多數人不通過的麻煩去讓他們的高山容器運行非根​​。

有沒有人有任何進一步的建議,以幫助調試?

+1

這是一個開發問題(DevOps)。我正在開發一個碼頭集裝箱,並且碼頭集裝箱正在使用Alpine。 請參閱堆棧溢出其他與docker相關的問題的數量巨大:https://stackoverflow.com/search?q=docker –

回答

0

cron本身應該運行爲root,無論您想用哪個用戶來運行作業。

事實上,當你運行:

RUN crontab -u robuser /tmp/cloudwatch/crontab.conf 

這將安裝一個crontab用戶robuser。當cron從這個特定的crontab執行作業時,它會自動將用戶切換到robuser但是,如果cron未以root的形式運行,則不能切換此類用戶,這就是爲什麼您需要以root身份運行cron

因此,爲了cron在這裏工作,你需要從你的Dockerfile刪除此指令:

USER robuser 

注意,你可能不會走出困境,一旦你解決這個問題:如果您使用環境變量將AWS憑據傳遞給您的監控腳本(看起來您在這裏使用的是AWS),則這將不起作用,因爲cron將在切換用戶之前刪除這些憑據。這在很大程度上是cron中的一項安全功能,用於避免對非特權用戶的環境變量泄漏。另外:我寫了一個開源的crontab runner,Supercronic,它專門爲容器用例設計,它修復了這個問題(你可以將它作爲非特權用戶來運行)。如果你對常規的cron感到沮喪,你可以隨時投注。

+0

很好的答案,謝謝。但是,您刪除'USER robuser'的建議意味着我的整個容器不會以_robuser_的形式運行。這包括我的jboss服務器。正如你所描述的,它聽起來像運行cron作爲_root_並運行我的jboss服務器,因爲_robuser_是不可能的。 –

+0

@ user3460784如果你想使用普通的'cron',那麼你可能無法像非特權用戶那樣運行它。但是,您可以將其作爲特權用戶運行,然後使用[gosu](https://github.com/tianon/gosu)作爲非特權用戶運行jboss! –

相關問題