使用 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 定義不同,因為它會同時等待 forkexec,而不是等待 fork

      • notify:與 exec 相同,但 systemd 未設定 NOTIFY_SOCKET 環境變數,因此 sd_notify systemd 呼叫無法運作。

      • oneshot:在可執行檔上呼叫 exec 後,系統會將服務視為已啟動。如果服務結束時傳回的錯誤碼不等於 0,則狀態為 error

    • 服務的 prestartstartpoststartstatus 指令。

      如要啟動服務,Migrate to Containers 會依序執行 prestart 指令 (如有)、start 指令,最後是 poststart 指令 (如有)。如果指令失敗,且您未將指令設為使用 ignore_errors,服務就會停止,您會在服務狀態中看到錯誤訊息。

      用於在應用程式上執行特定作業的指令格式如下:

        command-type: 
          cmd: command
          shell: /bin/sh
          ignore_errors: false
          ignore_environment_variables: false

      其中:

      • command-type:指定指令類型為 prestartstartpoststartstatus

        針對 start,您可以使用單一指令,除非 typeoneshot

        如果是 type=forkingtype=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_time
      
      • name:指定計時器的名稱。

      • on_calendar:指定計時器的日曆活動清單。

        • cron:使用 Cron 格式指定的時間。例如:

          cron: 0 0 * * *
          cron: @daily
          
      • on_startup:指定一組時長 (相對於部署容器的時間)。

        • duration:使用時間長度格式指定的時間。例如:
        duration: 30m
        duration: 1sec
        
      • on_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 檔案,在其中新增或移除服務。每當您新增服務時,都必須填入下列欄位:

  • name
  • type
  • start

如要進一步瞭解服務的必要和選用欄位,請參閱上述 services.yaml 定義。

新增服務

如要將服務新增至 services.yaml 檔案,請按照下列步驟操作:

  1. 在文字編輯器中開啟 services.yaml 檔案進行修改。

  2. services.yaml 中,前往 applications 屬性:

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    
  3. 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:
        ...
    
  4. 儲存 services.yaml 檔案。

移除服務

如要從 services.yaml 檔案中移除服務,請按照下列步驟操作:

  1. 在文字編輯器中開啟 services.yaml 檔案進行修改。

  2. services.yaml 中,前往 applications 屬性:

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    ...
    
  3. 移除所需服務,從 name 欄位開始,接著移除應用程式適用的其他必填和選填欄位。例如:

    在移除服務前:

    version: v1beta1
    env:
    - name: KEY1
      ...
    applications:
    - name:
      type:
      start:
        - cmd:
    - name:
      ...
    
    

    服務移除後:

    version: v1beta1
    env:
    - name: KEY1
      ...
    applications:
    - name:
      ...
    
  4. 儲存 services.yaml 檔案。