使用 services-config.yaml
當您使用簡化的 Linux 服務管理員執行遷移作業時,「遷移至容器」會建立新的構件檔案 services-config.yaml。您可以使用這個檔案控制已部署容器中的應用程式初始化作業。
舉例來說,在遷移容器後,請編輯 services-config.yaml 檔案,以控制應用程式初始化作業:
- 從檔案中移除應用程式
- 在檔案中新增應用程式
- 編輯應用程式的初始化屬性
以下是 services-config.yaml 檔案範例:
version: v1beta1 env: - name: KEY1 value: VALUE1 - name: KEY2 value: VALUE2 applications: - name: nginx type: forking envfile: /path/to/file.txt env: - name: KEY3 value: VALUE3 start: - cmd: /usr/sbin/nginx -g 'daemon on; master_process on;' pidfile: /run/nginx.pid - name: ssh@ type: simple start: - cmd: /usr/sbin/sshd -i $SSHD_OPTS ignore_errors: true runtime_directories: mode: "0755" paths: - /run/sshd preserve: true - name: suitecrm type: exec start: - cmd: /etc/init.d/suitecrm start status: cmd: /etc/init.d/suitecrm status - name: phpsessionclean type: oneshot start: - cmd: /usr/lib/php/sessionclean timers: - name: phpsessionclean.timer on_calendar: - cron: 09,39 * * * * - name: mariadb type: notify prestart: - cmd: /usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld - cmd: /bin/sh -c "systemctl unset-environment _WSREP_START_POSITION" - cmd: /bin/sh -c "[ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1" start: - cmd: /usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION poststart: - cmd: /bin/sh -c "systemctl unset-environment _WSREP_START_POSITION" - cmd: /etc/mysql/debian-start user: mysql group: mysql
在這個檔案中:
env:在全域層級或應用程式層級指定環境變數。如果您在全域和應用程式層級同時指定相同的環境變數,則應用程式層級的環境變數會優先採用。如果是在全域層級設定的環境變數,請使用
env指定name/value組合。名稱可包含 ASCII 字母、數字和底線字元。名稱開頭不得為數字。如果是在應用程式層級設定的環境變數,請使用
env指定name/value組合。或者,您也可以使用envfile指定包含下列格式行文字檔的路徑:# Comments allowed KEY=VALUE
如果文字檔案包含的環境變數定義與
env指定的變數重複,則以env指定的變數為優先。
applications:指定在部署容器時要啟動的應用程式清單,並設定應用程式的初始化屬性。name:指定應用程式名稱。type會指定應用程式類型,如下所示:forking:不分支,執行start指定的檔案。服務執行檔應會分支。建議您一併設定pidfile。exec:分支執行服務。在可執行檔上呼叫exec後,系統會將服務視為已啟動。simple- 與exec相同。simple服務的行為與systemd定義不同,因為它會同時等待fork和exec,而不是等待fork。notify:與exec相同,但systemd未設定NOTIFY_SOCKET環境變數,因此sd_notify systemd呼叫無法運作。oneshot:在可執行檔上呼叫exec後,系統會將服務視為已啟動。如果服務結束時傳回的錯誤碼不等於 0,則狀態為error。
服務的
prestart、start、poststart和status指令。如要啟動服務,Migrate to Containers 會依序執行
prestart指令 (如有)、start指令,最後是poststart指令 (如有)。如果指令失敗,且您未將指令設為使用ignore_errors,服務就會停止,您會在服務狀態中看到錯誤訊息。用於在應用程式上執行特定作業的指令格式如下:
command-type: cmd: command shell: /bin/sh ignore_errors: false ignore_environment_variables: false
其中:
command-type:指定指令類型為
prestart、start、poststart或status。針對
start,您可以使用單一指令,除非type為oneshot。如果是
type=forking或type=oneshot,則會在start指令分支後執行poststart指令。否則,系統會在執行start指令後立即執行這些指令。command:指定要執行的指令,以便執行作業。
shell(選用):根據預設,所有指令都會在/bin/sh殼層中執行。您可以選擇將shell設為/bin/bash。ignore_errors(選用):如果為true,則系統會記錄指令的結束代碼,通常會視為失敗,但指令會視為成功。預設值為false。根據預設,Migrate to Containers 會將
ignore_errors設為true,適用於任何包含「-」前置字元的systemd可執行檔。ignore_environment_variables(選用):如果為true,系統就不會套用環境變數替代值。預設值為false。根據預設,Migrate to Containers 會將
ignore_environment_variables設為true,適用於任何包含「:」前置字元的systemd可執行檔。
pidfile:指定包含服務程序 ID 的 pid 檔案,用於檢查程序是否仍在執行。chdir:指定啟動程序的工作目錄。user:指定啟動新程序的使用者名稱。group:指定新程序啟動時所屬的群組名稱。timers:指定應用程式的計時器清單。只要任何指定的計時器到期,應用程式就會啟用。version: v1beta1 env: [] Applications: - name: service_name type: service_type start: - cmd: service_exec_command timers: - name: timer_name on_calendar: - cron: realtime_time on_startup: - duration: monotonic_time on_service_start: - duration: monotonic_time on_service_stop: - duration: monotonic_timename:指定計時器的名稱。on_calendar:指定計時器的日曆活動清單。cron:使用 Cron 格式指定的時間。例如:cron: 0 0 * * * cron: @daily
on_startup:指定一組時長 (相對於部署容器的時間)。duration:使用時間長度格式指定的時間。例如:
duration: 30m duration: 1secon_service_start:指定與應用程式狀態變更為「啟用」相關的時間長度清單。duration:使用時間長度格式指定的時間。
on_service_stop:指定與應用程式狀態變更為「已停用」相關的時間長度清單。duration:使用時間長度格式指定的時間。
請使用下列屬性,將
paths指定至在啟動服務前建立的資料夾:runtime_directories:指定paths清單,以便在/run/中建立目錄。state_directories:指定paths清單,以便在/var/lib/中建立目錄。cache_directories:指定paths清單,以便在/var/cache/中建立目錄。logs_directories:指定paths清單,以便在/var/log/中建立目錄。configuration_directories:指定paths清單,以便在/etc/中建立目錄。
每個屬性都會採用下列選項:
mode:指定檔案模式。預設值為 0755,對應於所有使用者的讀取和執行權限,以及擁有者的寫入權限。preserve:如果為false,服務停止時會清理目錄。預設值為true。
在 services.yaml 檔案中新增或移除服務
您可以手動編輯 services.yaml 檔案,在其中新增或移除服務。每當您新增服務時,都必須填入下列欄位:
nametypestart
如要進一步瞭解服務的必要和選用欄位,請參閱上述 services.yaml 定義。
新增服務
如要將服務新增至 services.yaml 檔案,請按照下列步驟操作:
在文字編輯器中開啟
services.yaml檔案進行修改。在
services.yaml中,前往applications屬性:version: v1beta1 env: - name: KEY1 ... applications:在
applications屬性下方的行中新增所需服務,從name欄位開始,接著是其他適用於應用程式的必要和選用欄位:version: v1beta1 env: - name: KEY1 ... applications: - name: type: start: - cmd: ...如果
services.yaml檔案的applications屬性下方已有服務定義,您可以在上一個服務的最後一個項目下方,新增以name欄位開頭的新服務:version: v1beta1 env: - name: KEY1 ... applications: - name: type: start: - name: type: start: ...儲存
services.yaml檔案。
移除服務
如要從 services.yaml 檔案中移除服務,請按照下列步驟操作:
在文字編輯器中開啟
services.yaml檔案進行修改。在
services.yaml中,前往applications屬性:version: v1beta1 env: - name: KEY1 ... applications: ...移除所需服務,從
name欄位開始,接著移除應用程式適用的其他必填和選填欄位。例如:在移除服務前:
version: v1beta1 env: - name: KEY1 ... applications: - name: type: start: - cmd: - name: ...服務移除後:
version: v1beta1 env: - name: KEY1 ... applications: - name: ...儲存
services.yaml檔案。