关于如何使用dockerfile -d 启动webman的那些事

今天起床在群里看到有人讨论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的守护进程又能保持容器不会退出。

1155 8 11
8个评论

软饭工程师

流弊

  • 暂无评论
10bang

感谢分享

  • 暂无评论
xpwsgg

厉害୧(๑•̀◡•́๑)૭

  • 暂无评论
白鹄

CMD 里面的-d 可以去掉了 你本来容器外-d 守护进程了 里面就没必要-d 运行了

  • ngrok.cc内网穿透 2023-08-22

    容器外的-d是守护容器的进程,不是webman的进程

  • 白鹄 2023-08-22

    是啊 这个就相当于电脑一直开着 挂着游戏窗口 webman -d 不-d都无所谓了啊

  • ngrok.cc内网穿透 2023-08-22

    看人需求,有人需要这样的功能,有人不需要

admin

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)了

admin

截图
CMD ["sh","-c","php start.php start -d && sh"]

可以 启动 start.php start -d并且 最后永远在sh 中运行,只要你不再sh中输入exit,容器不会停止

截图

admin

截图

抱歉CMD我写错了,你这样

CMD sh -c "php /app/start.php start -d && sh"
  • 暂无评论
wzj177

好分享。这个问题想到了前两年,公司老大让我用webman写一个利用sonarqube的hock来检测项目代码质量的工作,做完了,让我用docker,最后我也是用守护进程启动。最后,老大也给了我指点,记得大致是 很多面试者都会在简历写精通docker,但是很多没真正弄过docker的都不知道为啥不能守护进程。我也记不到当时说的内容了,但记住了需要一个进程挂起

  • 暂无评论

ngrok.cc内网穿透

914
积分
0
获赞数
0
粉丝数
2021-03-06 加入
×
🔝