docker容器內(nèi)要啟動(dòng)兩個(gè)進(jìn)程時(shí)Dockerfile的實(shí)現(xiàn)代碼
近期想做一個(gè)cron定時(shí)任務(wù)的docker,在Dockerfile中做如下定義
FROM library/alpine:latest RUN apk --update add rsync openssh bash VOLUME ["/data"] ADD start.sh / CMD ["/bin/bash","/start.sh"]
在start.sh中用crontab 加載定時(shí)任務(wù)run.cron,然后啟動(dòng)crond:
/usr/bin/crontab /run.cron
/usr/sbin/crond
docker build Dockerfile后,采用docker run –name xxx -d 運(yùn)行容器,發(fā)現(xiàn)start.sh執(zhí)行后容器就退出了,根本無(wú)法啟動(dòng)定時(shí)任務(wù),網(wǎng)上各種辦法有說(shuō)用nohup,有死循環(huán),還有說(shuō)用信號(hào),發(fā)現(xiàn)都不靠譜。
分析了一下docker的機(jī)制,一個(gè)docker容器同時(shí)只能管理一個(gè)進(jìn)程,這個(gè)進(jìn)程退出后,容器也就退出了。這并不意味著一個(gè)容器里只能同時(shí)運(yùn)行一個(gè)進(jìn)程(那樣太浪費(fèi)了),只是最后一個(gè)運(yùn)行的進(jìn)程不能退出。
這個(gè)案例在容器啟動(dòng)運(yùn)行start.sh,crond的缺省設(shè)置是后臺(tái)運(yùn)行,這樣導(dǎo)致start.sh運(yùn)行結(jié)束,容器跟著start.sh退出而退出。
因此,在start.sh中,crond 應(yīng)強(qiáng)制采用前臺(tái)運(yùn)行:crond -f。
這樣start.sh就不會(huì)退出, docker run -d 運(yùn)行時(shí)就可以保持容器后臺(tái)運(yùn)行。
start.sh總結(jié)總結(jié):
(1)容器中運(yùn)行多個(gè)守護(hù)進(jìn)程時(shí),前面的進(jìn)程要用后臺(tái)方式運(yùn)行(或添加 &),否則后面的服務(wù)無(wú)法啟動(dòng)
(2)容器中最后一個(gè)守護(hù)進(jìn)程一定要用前臺(tái)方式運(yùn)行,否則start.sh退出,容器退出,所有的服務(wù)就白啟動(dòng)了
FROM ubuntu:latest RUN mkdir -p "/usr/src/pdas" \ mkdir -p "/usr/src/pdas/reload" COPY bin.tar /usr/src/pdas COPY config.tar /usr/src/pdas COPY lib.tar /usr/src/pdas WORKDIR /usr/src/pdas RUN tar -xvf lib.tar && \ tar -xvf bin.tar && \ tar -xvf config.tar ENV LD_LIBRARY_PATH /usr/src/pdas/lib/libxml/lib:/usr/src/pdas/lib/curl/lib:$LD_LIBRARY_PATH WORKDIR /usr/src/pdas/bin RUN chmod +x start.sh && \ chmod +x f_recv && \ chmod +x f_send VOLUME /behb/diqu VOLUME /var/log/pdas ENTRYPOINT ./start.sh
其中 ./start.sh腳本如下
#!/bin/bash ./f_recv & ./f_send
以上是docker鏡像啟動(dòng)腳本的一點(diǎn)心得。
補(bǔ)充知識(shí):Docker中運(yùn)行多個(gè)進(jìn)程時(shí)的處理
通常,Docker容器適合運(yùn)行單個(gè)進(jìn)程,但是很多時(shí)候我們需要在Docker容器中運(yùn)行多個(gè)進(jìn)程。這時(shí)有兩種不同方法來(lái)運(yùn)行多進(jìn)程容器:使用shell腳本或者supervisor,兩種方法都很簡(jiǎn)單,各有優(yōu)劣,只是有一些值得注意的細(xì)節(jié)。這里只講用腳本的處理方法。
寫一個(gè)腳本multiple_thread.sh,腳本功能運(yùn)行兩個(gè)python程序,將運(yùn)行結(jié)果保存到log文件中。腳本內(nèi)容如下
#!/bin/bash # Start the first process nohup python -u /tmp/thread1.py > /tmp/thread1.log 2>&1 & ps aux |grep thread1 |grep -q -v grep PROCESS_1_STATUS=$? echo "thread1 status..." echo $PROCESS_1_STATUS if [ $PROCESS_1_STATUS -ne 0 ]; then echo "Failed to start my_first_process: $PROCESS_2_STATUS" exit $PROCESS_1_STATUS fi sleep 5 # Start the second process nohup python -u /tmp/thread2.py > /tmp/thread2.log 2>&1 & ps aux |grep thread2 |grep -q -v grep PROCESS_2_STATUS=$? echo "thread2 status..." echo $PROCESS_2_STATUS if [ $PROCESS_2_STATUS -ne 0 ]; then echo "Failed to start my_second_process: $PROCESS_2_STATUS" exit $PROCESS_2_STATUS fi # 每隔60秒檢查進(jìn)程是否運(yùn)行 while sleep 60; do ps aux |grep thread1 |grep -q -v grep PROCESS_1_STATUS=$? ps aux |grep thread2 |grep -q -v grep PROCESS_2_STATUS=$? # If the greps above find anything, they exit with 0 status # If they are not both 0, then something is wrong if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then echo "One of the processes has already exited." exit 1 fi
下一步制作Dockerfile:
FROM centos:latest COPY thread1.py /tmp/thread1.py COPY thread2.py /tmp/thread2.py COPY multiple_thread.sh /tmp/multiple_thread.sh CMD bash /tmp/multiple_thread.sh
以上這篇docker容器內(nèi)要啟動(dòng)兩個(gè)進(jìn)程時(shí)Dockerfile的實(shí)現(xiàn)代碼就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker 退出container后保持繼續(xù)運(yùn)行的操作
這篇文章主要介紹了Docker 退出container后保持繼續(xù)運(yùn)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
從Docker容器中備份整個(gè)PostgreSQL的操作步驟
現(xiàn)在需要從Docker容器中備份整個(gè)PostgreSQL后,然后,使用備份文件在另外一個(gè)pg的docker容器中恢復(fù)過(guò)來(lái),所以本文給大家介紹了從Docker容器中備份整個(gè)PostgreSQL的操作步驟,通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-10-10
Docker運(yùn)行Web服務(wù)實(shí)戰(zhàn)之Tomcat的詳細(xì)過(guò)程
Tomcat是由Apache軟件基金會(huì)下屬的Jakarta項(xiàng)目開(kāi)發(fā)的一個(gè)Servlet容器,按照Sun Microsystems提供的技術(shù)規(guī)范,實(shí)現(xiàn)了對(duì)Servlet和Java Server Page(JSP)的支持,這篇文章主要介紹了Docker運(yùn)行Web服務(wù)實(shí)戰(zhàn)之Tomcat的詳細(xì)過(guò)程,需要的朋友可以參考下2022-08-08
docker compose部署cassandra集群的操作代碼
這篇文章主要介紹了docker compose部署cassandra集群的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03
Docker部署SpringBoot項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署SpringBoot項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2007-02-02
Docker容器的網(wǎng)絡(luò)管理和網(wǎng)絡(luò)隔離的實(shí)現(xiàn)
這篇文章主要介紹了Docker容器的網(wǎng)絡(luò)管理和網(wǎng)絡(luò)隔離的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

