我知道在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容器。
问题是你正在运行crond -f,而不是告诉bash在后台运行它,基本上保持bash等待crond退出以继续运行脚本。这有两个解决方案:
另外,我用exec启动apache:
exec httpd -D FOREGROUND
否则/startup/script.sh将继续运行,而它无论如何都没有做任何有用的事情。 exec告诉bash用要执行的命令替换当前进程。
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