在docker中运行apache和cron

问题描述 投票:0回答:2

我知道在docker容器中只有一个进程在前台运行。有没有机会在前台同时运行apache和cron?快速搜索说有一种称为supervisord的东西来实现这一点。但是有没有其他方法使用Entrypoint脚本或CMD?

这是我的Dockerfile

FROM alpine:edge
RUN  apk update && apk upgrade
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk   /repositories
RUN  apk add \
     bash \ 
     apache2 \
     php7-apache2 \
     php7 \
     curl \
     php7-mysqli \
     php7-pdo \
     php7-pdo_mysql

 RUN cp /usr/bin/php7 /usr/bin/php
 RUN mkdir /startup
 COPY script.sh /startup
 RUN chmod 755 /startup/script.sh
 ENTRYPOINT ["/startup/script.sh"]

script.sh的内容粘贴在下面

#!/bin/bash
# start cron
/usr/sbin/crond -f -l 8
# start apache
httpd -D FOREGROUND

当使用此映像运行docker时,只有crond正在运行,最有趣的是当我杀死cron时,apache启动并在前台运行。

我正在使用aws ecs ec2来使用任务定义和服务来运行docker容器。

apache docker dockerfile amazon-ecs alpine
2个回答
0
投票

问题是你正在运行crond -f,而不是告诉bash在后台运行它,基本上保持bash等待crond退出以继续运行脚本。这有两个解决方案:

  1. 删除-f标志(该标志导致crond在前台运行)。
  2. 添加&在crond线的末尾,在-l 8之后(我不推荐这个)。

另外,我用exec启动apache:

exec httpd -D FOREGROUND

否则/startup/script.sh将继续运行,而它无论如何都没有做任何有用的事情。 exec告诉bash用要执行的命令替换当前进程。


0
投票

Docker容器正在运行,而其中的主进程正在运行。因此,如果要在docker容器中运行两个服务,其中一个必须以后台模式运行。

我建议完全摆脱scrip.sh并用一个CMD层替换它:

CMD ( crond -f -l 8 & ) && httpd -D FOREGROUND

最终的Dockerfile是:

FROM alpine:edge
RUN  apk update && apk upgrade
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN  apk add \
     bash \ 
     apache2 \
     php7-apache2 \
     php7 \
     curl \
     php7-mysqli \
     php7-pdo \
     php7-pdo_mysql

RUN cp /usr/bin/php7 /usr/bin/php
CMD ( crond -f -l 8 & ) && httpd -D FOREGROUND
© www.soinside.com 2019 - 2024. All rights reserved.