今天起床在群里看到有人討論docker里面是否要使用supervisord守護進程來啟動webman。
我一想,webman不是自帶來守護進程模式嗎?workerman里面采用的是Master進程監(jiān)控子進程的模式啟動的,因此是支持守護進程模式的。如果還要依賴第三方來進行守護那么自帶的守護模式 -d
是不是就沒有存在的意義了。
看了群友的討論才知道,他們是使用了 -d
之后docker容器就退出了,其實這是一個docker的問題不是webman的問題。為什么會出現(xiàn)webman啟動的時候加了 -d
會導(dǎo)致容器退出,如果出現(xiàn)這樣的問題都是對 docker 不熟悉的開發(fā)者才會出現(xiàn)這種問題。
了解一下 docker 為什么會出現(xiàn)這種問題就能去解決這個問題了,在docker啟動一個容器,如果發(fā)現(xiàn)沒有前置進程就會終止容器,認(rèn)為你這個容器沒有存在的必要了。 既然知道問題是不是可以加一個前置進程解決這個問題?
答案是顯而易見的,比如很多人教部署nginx的時候都選擇了 daemon off
這種模式啟動,這種模式可以把nginx當(dāng)作前置進程來保持容器一直運行,但是這樣也存在一個問題,由于nginx不是守護進程啟動的,當(dāng)nginx出現(xiàn)問題掛掉的時候docker容器也會跟著退出,從而不能為用戶提供服務(wù)。
我們現(xiàn)在知道問題的緣由,也知道了這樣執(zhí)行會導(dǎo)致的問題,那么我們現(xiàn)在就來解決掉它
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
命令 正常的執(zhí)行一個 php 啟動 webman 的命令并且使用了 -d
進行守護進程啟動,那么如何保持容器不退出呢?重點就在于 tail -f /dev/null
它會一直阻塞在等待,這樣就能實現(xiàn)webman的守護進程又能保持容器不會退出。
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)了
CMD ["sh","-c","php start.php start -d && sh"]
可以 啟動 start.php start -d并且 最后永遠(yuǎn)在sh 中運行,只要你不再sh中輸入exit,容器不會停止
好分享。這個問題想到了前兩年,公司老大讓我用webman寫一個利用sonarqube的hock來檢測項目代碼質(zhì)量的工作,做完了,讓我用docker,最后我也是用守護進程啟動。最后,老大也給了我指點,記得大致是 很多面試者都會在簡歷寫精通docker,但是很多沒真正弄過docker的都不知道為啥不能守護進程。我也記不到當(dāng)時說的內(nèi)容了,但記住了需要一個進程掛起
流弊