2017-05-26 22 views
2

我对Docker很新颖。我已经使用php:7-fpm图像设置了一个dockerfile。除了用于运行我的站点的这个映像,我还想添加一个cron以执行常规任务。让cron在php上运行:7-fpm图像

我创建了一个cron,把它放在正确的文件夹中,然后运行docker exec -ti myimage_php_1 /bin/bash然后cron或者如果我的日志文件都工作正常。但是当容器被创建时,我无法让它工作,我不想手动启动cron。

据我了解,我需要使用CMDENTRYPOINT运行在启动时cron命令,但每次我这样做的时候它停止我的现场工作,由于我重写PHP原有的必要CMD/ENTRYPOINT功能:7- fpm图像。有没有办法触发这两个cron命令,并像以前一样继续使用php:7-fpm CMD/ENTRYPOINT s?

回答

4

方法#1

创建自定义entrypoint.sh,这样的事情:

#!/bin/bash 

cron -f & 
docker-php-entrypoint php-fpm 

注意&,它的意思是 “发送到后台”。

然后:

COPY ./entrypoint.sh/
ENTRYPOINT /entrypoint.sh 

方法2

但是,有是安装supervisor更sofisticated方式,请参阅docs(通常在码头工人使用的恶魔经理):

在Dockerfile中:

RUN apt-get update 

RUN apt-get install supervisor 
COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf 
... 
CMD ["/usr/bin/supervisord"] 

supervisord.conf

[program:cron] 
command = cron -f 

[program:php] 
command = docker-php-entrypoint php-fpm 

一些故障排除命令:

docker exec <container-id> supervisorctl status 
docker exec <container-id> supervisorctl tail -f php 
docker exec <container-id> supervisorctl tail -f cron 
docker exec <container-id> supervisorctl restart php 
+0

谢谢,这似乎已经做了我原来的问题的伎俩。我还有第二个问题,那就是当我通过entrypoint.sh文件运行它时,我不能再用'USER nginx'来更改用户,'su - nginx'似乎没有任何作用。我需要cron运行,但用户是'nginx'。如果我在Dockerfile中执行'USER nginx',我没有权限在entrypoint.sh中启动cron。有什么办法可以解决这个问题吗? – john

+0

把你的crontab信息放在/ etc/crontab中,并编辑它在命令前添加用户名:https://serverfault.com/a/352837/171205 – Robert

+0

除非我误解你,问题在于cron没有运行,所以我需要启动它......但在运行entrypoint.sh的时候,我的用户不是root用户(因为我需要它是USER Nginx对我的应用程序),所以我得到'cron:can' t打开或创建/var/run/crond.pid:权限被拒绝。这让我疯狂! – john