?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
容器的主要運行過程是ENTRYPOINT
和/或CMD
在Dockerfile
.一般建議您使用每個容器一個服務來區(qū)分關(guān)注的區(qū)域。該服務可能分到多個進程%28,例如,Apacheweb服務器啟動多個工作進程%29。有多個進程是可以的,但是為了從Docker中獲得最大的好處,請避免一個容器負責整個應用程序的多個方面。您可以使用用戶定義的網(wǎng)絡(luò)和共享卷連接多個容器。
容器的主進程負責管理它啟動的所有進程。在某些情況下,主進程設(shè)計不好,并且在容器存在時沒有很好地處理“收割”%28停止%29子進程。如果您的流程屬于此類別,則可以使用--init
選項在運行容器時。大--init
標志將一個微小的init進程插入容器中作為主進程,并在容器退出時處理所有進程的收獲。以這種方式處理這樣的過程比使用完全的init進程(例如sysvinit
,,,upstart
,或systemd
來處理容器中的流程生命周期。
如果您需要在一個容器中運行多個服務,您可以通過幾種不同的方式來完成這一任務。
將所有命令放入包裝腳本中,并提供測試和調(diào)試信息。將包裝器腳本作為CMD
這是一個很幼稚的例子。首先,包裝器腳本:
#%21/bin/bash#啟動第一個進程。[醫(yī)]第一[醫(yī)]進程-D狀態(tài)=$?如果$Status-N0;然后回顯“未能啟動我的[醫(yī)]第一[醫(yī)]進程:$state“退出$Statusfi#啟動第二個進程。[醫(yī)]第二[醫(yī)]進程-D狀態(tài)=$?如果$Status-N0;然后回顯“未能啟動我的[醫(yī)]第二[醫(yī)]Process:$Status“Exit$Statsfi#樸素檢查每分鐘運行一次檢查,以查看是否有任何進程退出。#這說明了如果要在容器中運行多個服務,需要完成的部分工作。如果檢測到任何一個進程已經(jīng)退出,容器將退出并帶有一個錯誤#。#否則它將永遠循環(huán),每60秒醒來一次/bin/true;[醫(yī)]第一[醫(yī)]過程grep-q-v grep過程[醫(yī)]一[醫(yī)]狀態(tài)=$?PS輔助grep我[醫(yī)]第二[醫(yī)]過程grep-q-v grep過程[醫(yī)]二[醫(yī)]狀態(tài)=$?#如果上面的grep找到了什么,如果它們都不是0,它們將退出0狀態(tài)#,那么如果$Process[醫(yī)]一[醫(yī)]狀態(tài)-n0-o$進程[醫(yī)]二[醫(yī)]現(xiàn)狀---N0然后回顯“其中一個進程已經(jīng)退出”。出口-1fi睡眠60完成
接下來,Dockerfile:
來自ubuntu的最新版本[醫(yī)]第一[醫(yī)]處理我的[醫(yī)]第一[醫(yī)]進程復制我的[醫(yī)]第二[醫(yī)]處理我的[醫(yī)]第二[醫(yī)]進程復制我的[醫(yī)]包裝器[醫(yī)]腳本噓我[醫(yī)]包裝器[醫(yī)]script.sh CMD./我[醫(yī)]包裝器[醫(yī)]script.sh
使用流程管理器,如supervisord
這是一種中等重量的方法,需要你打包。supervisord
以及它在圖像%28中的配置,或者將您的圖像建立在以下內(nèi)容的基礎(chǔ)上:supervisord
%29,以及它將管理的不同應用程序。然后你開始supervisord
,它為您管理您的流程。下面是一個使用這種方法的Dockerfile示例,它假定預先編寫的supervisord.conf
,,,my_first_process
,和my_second_process
所有文件都與您的Dockerfile位于同一個目錄中。
來自ubuntu:最新運行APT-獲取更新&APT-獲取安裝-y監(jiān)控器運行mkdir-p/var/log/主管復制Superord.conf/etc/Superor/con.d/visorord.conf復制我的[醫(yī)]第一[醫(yī)]處理我的[醫(yī)]第一[醫(yī)]進程復制我的[醫(yī)]第二[醫(yī)]處理我的[醫(yī)]第二[醫(yī)]過程CMD“/usr/bin/Superord”