乙個容器中執行多個前台程序

2021-10-04 01:29:42 字數 4394 閱讀 1253

背景:

在docker容器中,如果乙個容器只執行乙個程序服務是蠻簡單的,通過dockerfile中cmd就可以實現,如果有引數也只需使用enterpoint,cmd作為引數傳入即可。

然而所有事物都不是一層不變的,由於業務的需要本將nodejs執行的任務改為用python執行,這樣意味著乙個python容器中需要hold住三個py任務程序(原先在執行的與後來業務需要的),並且這三個py檔案執行過程中都是前台執行,作為單個執行正好符合docker容器必須前台執行的標準。但是三個就需要換一種方式解決了

這邊大部分情況下,我們通過shell指令碼,呼叫並執行任務。

正文:

一、 在真實伺服器上py執行,shell呼叫

[root@docker-server ~]

# cat restart,sh

#!/bin/sh

# 案件匯出

kill -9 `

ps -ef|

grep export_case.py |

grep -v grep

|awk''`

nohup python3 -u export_case.py $

>>

../logs/export_case.log 2>

&1 &

# 還款和減免

kill -9 `

ps -ef|

grep repayment_reduction_export.py |

grep -v grep

|awk''`

nohup python3 -u repayment_reduction_export.py $

>>

../logs/repayment_reduction_export.log 2>

&1 &

# 催記

kill -9 `

ps -ef|

grep export_case_operation.py |

grep -v grep

|awk''`

nohup python3 -u export_case_operation.py $

>>

../logs/export_case_operation.log 2>

&1

#因為真實伺服器不涉及必須前台執行,可以將前台執行的程序用& 後台執行。

二、 在python容器中執行py指令碼

#首先看下未引入其他任務時的情況

[root@0eeec2741cbb py]

# ps -ef

uid pid ppid c stime tty time cmd

root 1 0 0 08:58 ? 00:00:07 python3 export_case.py

root 8 0 0 16:44 ? 00:00:00 bash

root 23 8 0 16:44 ? 00:00:00 ps

-ef

#附上dockerfile

[root@docker-server python]

# cat dockerfile

from basecentos:1 #這裡定義一些業務所需要的配置程式等

#這一步以上可以自動安裝python環境,去掉&& \即可

workdir /root/python/py

#copy export_case.py export_case_operation.py repayment_reduction_export.py restart.sh /root/python/py/

#entrypoint python3 export_case.py #可加可不加,加上去規範點

#這是單程序業務作業時候

#entrypoint bash restart.sh

#這是後來新增新業務後寫法

#這邊只進行映象的編譯過程

#我這邊是通過jenkins自動構建映象

[root@docker-server script]

# cat python.sh

#!/bin/bash

id=$1

cat >> dockerfile << eof

from basepython:2

copy export_case.py export_case_operation.py repayment_reduction_export.py restart.sh /root/python/py/

#只是開始時候新增,後期通過對映關係,修改檔案重啟下容器即可,無需重新製作映象

workdir /root/python/py/

entrypoint bash restart.sh

eofif

[-d /usr/local/docker_registry/docker/registry/v2/repositories/python/_manifests/tags/

$id]

then

rm-rf /usr/local/docker_registry/docker/registry/v2/repositories/python/_manifests/tags/

$id docker rmi 127.0.0.1:5000/python:$id

fidocker build --no-cache -t 127.0.0.1:5000/python:$id

.docker push 127.0.0.1:5000/python:$id

rm-rf dockerfile

#如果用最先的restart.sh指令碼則會出現如下情況,只啟動了乙個程序

結論:

#最後經過摸索研究,一方面py檔案中如果匯入為匯入的模組則無報錯無法通過docker logs檢視,需要先導入模組,第二個就是啟動任務程序的shell指令碼不應該這樣寫。正確如下:

#!/bin/sh

# 案件匯出

# 還款和減免

# 催記

python3 export_case.py >> .

./logs/export_case.log 2>&1 & python3 repayment_reduction_export.py >> .

./logs/repayment_reduction_export.log 2>&1 & python3 export_case_operation.py >> .

./logs/export_case_operation.log 2>&1 && tail -f /dev/null

#這樣再去執行就ok了,用&連線,最後用tail卡在前台

乙個容器多個程序,乙個pod多個容器

乙個容器多個程序 在docker的映象編譯指令碼dockerfile中帶起多個程序,如下可以在contivnet.sh中啟動多個程序 from 192.168.1.2 5001 world centos7 ovs 2.6.4 1 copy bin contiv bin copy scripts co...

乙個Tomcat執行多個例項

本文介紹在同乙個tomcat下執行mydomain.com和mysite.com這兩個例項的步驟。有時候,我們希望週期性的更新tomcat 有時候,我們又想統一管理安裝在一台機器上的tomcat 比如讓tomcat版本統一,讓多個例項的tomcat的依賴統 一 配置統一等 在這些場景下,我們都不希望...

乙個程序控制多個socket

module test tcp compile export all include lib kernel include inet.hrl define tcp options,binary,test pid spawn link module,loop,gen tcp listen 6099,t...