我理解在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容器,使用任务定义和服务。
3条答案
按热度按时间vaqhlq811#
Docker容器正在运行,而其内部的主进程正在运行。因此,如果你想在Docker容器中运行两个服务,其中一个必须在后台模式下运行。
我建议完全去掉
scrip.sh
,只替换为一个CMD
层:最后的
Dockerfile
是:uttx8gqw2#
问题是您运行crond-f,而没有告诉bash在后台运行它,基本上是让bash等待crond退出以继续运行脚本。有两种解决方案:
1.删除-f标志(该标志会导致crond在前台运行)。
1.在crond行的末尾,在-l 8之后添加&(我不推荐这样做)。
另外,我会用exec启动apache:
否则,/startup/script.sh将继续运行,但它不再做任何有用的事情。exec告诉bash用要执行的命令替换当前进程。
bfnvny8b3#
找到了另一个帖子的不同解决方案:
(示例从php:7.4-apache开始)
这将使您的cron进程与apache 2沿着在容器内运行。在一个相关的说明中,我在这里研究如何在容器启动后更改卷内文件的权限,但由于您现在已经运行了cron,只需复制一个shell文件,该文件可以进行任何您喜欢的更正,并将其设置为每分钟在cron中运行,如下所示: