为什么 Dockerfile 运行 中的 cron 服务没有?
Why doesn't the cron service in Dockerfile run?
虽然 searching 这个问题我发现: cron -f
应该启动服务。
所以我有:
RUN apt-get install -qq -y git cron
接下来我有:
CMD cron -f && crontab -l > pullCron && echo "* * * * * git -C ${HOMEDIR} pull" >> pullCron && crontab pullCron && rm pullCron
我的 dockerfile 部署没有错误,但 cron 没有 运行。我该怎么做才能通过添加的行启动 cron 服务?
PS:
我知道我的 cron 中的 git 函数实际上应该是一个钩子,但对我(可能还有其他人)来说,这是关于学习如何使用 Docker 设置 cron :-)
PPS:
完成 Docker 文件(已更新):
RUN apt-get update && apt-get upgrade -y
RUN mkdir -p /var/log/supervisor
RUN apt-get install -qq -y nginx git supervisor cron wget
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN wget -O ./supervisord.conf https://raw.githubusercontent.com/..../supervisord.conf
RUN mv ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN apt-get install software-properties-common -y && apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 && add-apt-repository 'deb http://dl.hhvm.com/ubuntu utopic main' && apt-get update && apt-get install hhvm -y
RUN cd ${HOMEDIR} && git clone ${GITDIR} && mv ./tybalt/* ./ && rm -r ./tybalt && git init
RUN echo "* * * * * 'cd ${HOMEDIR} && /usr/bin/git pull origin master'" >> pullCron && crontab pullCron && rm pullCron
EXPOSE 80
CMD ["/usr/bin/supervisord"]
PPPS:
Supervisord.conf:
[supervisord]
autostart=true
autorestart=true
nodaemon=true
[program:nginx]
command=/usr/sbin/nginx -c /etc/nginx/nginx.conf
[program:cron]
command = cron -f -L 15
autostart=true
autorestart=true
Cron 不是 运行 因为只有最后一个 CMD
会覆盖第一个(正如@xuhdev 所说)。它记录在这里:https://docs.docker.com/reference/builder/#cmd.
There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.
如果你想在同一个容器中包含 nginx
和 cron
运行,你需要使用某种主管(比如 supervisord
或其他)那将是容器的 pid 1 进程并管理子进程。我认为这个项目应该有所帮助:https://github.com/nbraquart/docker-nginx-php5-cron(它似乎可以实现您想要实现的目标)。
根据您的 cron 的用途,还有其他解决方案 — 例如为每个提交或每个标签构建一个新图像等...
与 supervisor 一起启动 cron,你的 cron 作业应该被执行。以下是您可以采取的故障排除步骤,以确保 cron 运行ning
cron 守护进程运行是否在容器中?登录容器并 运行 ps a | grep cron
查找。使用docker exec -ti CONTAINERID /bin/bash
登录容器。
supervisord是运行ning吗?
- 例如,在我的设置中,以下主管配置可以正常工作。图片是
ubuntu:14.04
。我在 Dockerfile 中有 CMD ["/usr/bin/supervisord"]
。
[supervisord]
nodaemon=true
[program:crond]
command = /usr/sbin/cron
user = root
autostart = true
尝试另一个简单的 cron 作业以确定问题是出在您的 cron 条目还是 cron 守护进程。使用 crontab -e
登录到容器时添加:
* * * * * echo "hi there" >> /tmp/test
检查容器日志以获取有关 cron 的更多信息:
docker logs CONTAINERID | grep -i cron
这些只是您可以遵循的一些故障排除提示。
我已经在 CentOS 上使用过它并且它有效:
CMD service crond start ; tail -f /var/log/cron
我的 Dockerfile 的其余部分只是 yum 安装 cronie 并触及 /var/log/cron
文件,因此当 CMD 运行时它会在那里。
在 centos 7 上这对我有用
[program:cron]
command=/usr/sbin/crond -n -s
user = root
autostart = true
stderr_logfile=/var/log/cron.err.log
stdout_logfile=/var/log/cron.log
-n代表前景
-s 是记录到stdout和stderr
就我而言,事实证明我需要 运行 cron start
在 运行 时间。我不能把它放在我的 Dockerfile 中,也不能 docker-compose.yml,所以我最终把它放在我用于部署的 Makefile 中。
类似于:
task-name:
@ docker-compose down && docker-compose build && docker-compose up -d
docker exec CONTAINERNAME /bin/bash -c cron start
虽然 searching 这个问题我发现: cron -f
应该启动服务。
所以我有:
RUN apt-get install -qq -y git cron
接下来我有:
CMD cron -f && crontab -l > pullCron && echo "* * * * * git -C ${HOMEDIR} pull" >> pullCron && crontab pullCron && rm pullCron
我的 dockerfile 部署没有错误,但 cron 没有 运行。我该怎么做才能通过添加的行启动 cron 服务?
PS:
我知道我的 cron 中的 git 函数实际上应该是一个钩子,但对我(可能还有其他人)来说,这是关于学习如何使用 Docker 设置 cron :-)
PPS:
完成 Docker 文件(已更新):
RUN apt-get update && apt-get upgrade -y
RUN mkdir -p /var/log/supervisor
RUN apt-get install -qq -y nginx git supervisor cron wget
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN wget -O ./supervisord.conf https://raw.githubusercontent.com/..../supervisord.conf
RUN mv ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN apt-get install software-properties-common -y && apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 && add-apt-repository 'deb http://dl.hhvm.com/ubuntu utopic main' && apt-get update && apt-get install hhvm -y
RUN cd ${HOMEDIR} && git clone ${GITDIR} && mv ./tybalt/* ./ && rm -r ./tybalt && git init
RUN echo "* * * * * 'cd ${HOMEDIR} && /usr/bin/git pull origin master'" >> pullCron && crontab pullCron && rm pullCron
EXPOSE 80
CMD ["/usr/bin/supervisord"]
PPPS:
Supervisord.conf:
[supervisord]
autostart=true
autorestart=true
nodaemon=true
[program:nginx]
command=/usr/sbin/nginx -c /etc/nginx/nginx.conf
[program:cron]
command = cron -f -L 15
autostart=true
autorestart=true
Cron 不是 运行 因为只有最后一个 CMD
会覆盖第一个(正如@xuhdev 所说)。它记录在这里:https://docs.docker.com/reference/builder/#cmd.
There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.
如果你想在同一个容器中包含 nginx
和 cron
运行,你需要使用某种主管(比如 supervisord
或其他)那将是容器的 pid 1 进程并管理子进程。我认为这个项目应该有所帮助:https://github.com/nbraquart/docker-nginx-php5-cron(它似乎可以实现您想要实现的目标)。
根据您的 cron 的用途,还有其他解决方案 — 例如为每个提交或每个标签构建一个新图像等...
与 supervisor 一起启动 cron,你的 cron 作业应该被执行。以下是您可以采取的故障排除步骤,以确保 cron 运行ning
cron 守护进程运行是否在容器中?登录容器并 运行
ps a | grep cron
查找。使用docker exec -ti CONTAINERID /bin/bash
登录容器。supervisord是运行ning吗?
- 例如,在我的设置中,以下主管配置可以正常工作。图片是
ubuntu:14.04
。我在 Dockerfile 中有CMD ["/usr/bin/supervisord"]
。
[supervisord]
nodaemon=true
[program:crond]
command = /usr/sbin/cron
user = root
autostart = true
尝试另一个简单的 cron 作业以确定问题是出在您的 cron 条目还是 cron 守护进程。使用
crontab -e
登录到容器时添加:* * * * * echo "hi there" >> /tmp/test
检查容器日志以获取有关 cron 的更多信息:
docker logs CONTAINERID | grep -i cron
这些只是您可以遵循的一些故障排除提示。
我已经在 CentOS 上使用过它并且它有效:
CMD service crond start ; tail -f /var/log/cron
我的 Dockerfile 的其余部分只是 yum 安装 cronie 并触及 /var/log/cron
文件,因此当 CMD 运行时它会在那里。
在 centos 7 上这对我有用
[program:cron]
command=/usr/sbin/crond -n -s
user = root
autostart = true
stderr_logfile=/var/log/cron.err.log
stdout_logfile=/var/log/cron.log
-n代表前景 -s 是记录到stdout和stderr
就我而言,事实证明我需要 运行 cron start
在 运行 时间。我不能把它放在我的 Dockerfile 中,也不能 docker-compose.yml,所以我最终把它放在我用于部署的 Makefile 中。
类似于:
task-name:
@ docker-compose down && docker-compose build && docker-compose up -d
docker exec CONTAINERNAME /bin/bash -c cron start