在docker中运行apache和cron

k2fxgqgv  于 2023-05-16  发布在  Docker
关注(0)|答案(3)|浏览(222)

我理解在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"]

www.example.com的内容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容器,使用任务定义和服务。

vaqhlq81

vaqhlq811#

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
uttx8gqw

uttx8gqw2#

问题是您运行crond-f,而没有告诉bash在后台运行它,基本上是让bash等待crond退出以继续运行脚本。有两种解决方案:
1.删除-f标志(该标志会导致crond在前台运行)。
1.在crond行的末尾,在-l 8之后添加&(我不推荐这样做)。
另外,我会用exec启动apache:

exec httpd -D FOREGROUND

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

bfnvny8b

bfnvny8b3#

找到了另一个帖子的不同解决方案:

# Add a command to base-image entrypoint script
RUN sed -i 's/^exec /service cron start\n\nexec /' /usr/local/bin/apache2-foreground

(示例从php:7.4-apache开始)
这将使您的cron进程与apache 2沿着在容器内运行。在一个相关的说明中,我在这里研究如何在容器启动后更改卷内文件的权限,但由于您现在已经运行了cron,只需复制一个shell文件,该文件可以进行任何您喜欢的更正,并将其设置为每分钟在cron中运行,如下所示:

COPY permissionsfixes.sh /tmp/permfixes.sh
RUN (echo "* * * * * /tmp/permfixes.sh") | crontab

相关问题