今天起床在群里看到有人讨论docker里面是否要使用supervisord守护进程来启动webman。
我一想,webman不是自带来守护进程模式吗?workerman里面采用的是Master进程监控子进程的模式启动的,因此是支持守护进程模式的。如果还要依赖第三方来进行守护那么自带的守护模式 -d
是不是就没有存在的意义了。
看了群友的讨论才知道,他们是使用了 -d
之后docker容器就退出了,其实这是一个docker的问题不是webman的问题。为什么会出现webman启动的时候加了 -d
会导致容器退出,如果出现这样的问题都是对 docker 不熟悉的开发者才会出现这种问题。
了解一下 docker 为什么会出现这种问题就能去解决这个问题了,在docker启动一个容器,如果发现没有前置进程就会终止容器,认为你这个容器没有存在的必要了。 既然知道问题是不是可以加一个前置进程解决这个问题?
答案是显而易见的,比如很多人教部署nginx的时候都选择了 daemon off
这种模式启动,这种模式可以把nginx当作前置进程来保持容器一直运行,但是这样也存在一个问题,由于nginx不是守护进程启动的,当nginx出现问题挂掉的时候docker容器也会跟着退出,从而不能为用户提供服务。
我们现在知道问题的缘由,也知道了这样执行会导致的问题,那么我们现在就来解决掉它
FROM php:8.1-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk update --no-cache \
&& docker-php-source extract \
&& docker-php-ext-install -j$(nproc) pcntl \
&& docker-php-ext-enable opcache pcntl\
curl unzip \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY . /app
WORKDIR /app
VOLUME /app
RUN composer install
EXPOSE 8787
CMD ["sh","-c","php start.php start -d && tail -f /dev/null"]
这是我用来测试的一个Dockerfile文件,我们主要看 CMD
这里采用了 shell
命令 正常的执行一个 php 启动 webman 的命令并且使用了 -d
进行守护进程启动,那么如何保持容器不退出呢?重点就在于 tail -f /dev/null
它会一直阻塞在等待,这样就能实现webman的守护进程又能保持容器不会退出。
流弊
感谢分享
厉害୧(๑•̀◡•́๑)૭
CMD 里面的-d 可以去掉了 你本来容器外-d 守护进程了 里面就没必要-d 运行了
容器外的-d是守护容器的进程,不是webman的进程
是啊 这个就相当于电脑一直开着 挂着游戏窗口 webman -d 不-d都无所谓了啊
看人需求,有人需要这样的功能,有人不需要
CMD ["sh","-c","php start.php start -d && tail -f /dev/null"]
为什么不直接
CMD ["sh","-c","php start.php start -d && sh"]
并且 attache的时候就能直接进入shell了。
docker容器只要有一个阻塞式的指令就能防止容器exit(0)了
按照你用的直接最后使用sh会退出容器的,这个命令无法阻塞
欸!!! 你怎么能叫admin呢...QAQ
CMD ["sh","-c","php start.php start -d && sh"]
可以 启动 start.php start -d并且 最后永远在sh 中运行,只要你不再sh中输入exit,容器不会停止
我这边测试按照你这条命令直接退出了
不可能啊,我在windows和linux一直都是这么用的,火速qq群 发下图
我使用的是dockerfile,不是-it
抱歉CMD我写错了,你这样
好分享。这个问题想到了前两年,公司老大让我用webman写一个利用sonarqube的hock来检测项目代码质量的工作,做完了,让我用docker,最后我也是用守护进程启动。最后,老大也给了我指点,记得大致是 很多面试者都会在简历写精通docker,但是很多没真正弄过docker的都不知道为啥不能守护进程。我也记不到当时说的内容了,但记住了需要一个进程挂起