使用 services-config.yaml

使用简化的 Linux 服务管理器执行迁移时,Migrate to Containers 会创建新的工件文件 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,则 poststart 命令会在 start 命令创建分支后执行。否则,这些命令将在执行 start 命令后立即执行。

      • command:指定用于执行操作的命令。

      • shell(可选):默认情况下,所有命令都在 /bin/sh shell 中执行。您可以选择将 shell 设置为 /bin/bash

      • ignore_errors(可选):如果为 true,则系统会记录通常被视为失败的命令中的退出代码,但会将该命令视为成功。默认值为 false

        默认情况下,对于任何包含“-”前缀的 systemd 可执行文件,Migrate to Containers 会将 ignore_errors 设置为 true

      • ignore_environment_variables(可选):如果为 true,则不会应用环境变量替换。默认值为 false

        默认情况下,对于任何包含“:”前缀的 systemd 可执行文件,Migrate to Containers 会将 ignore_environment_variables 设置为 true

    • pidfile:指定 pid 文件,该文件包含用于检查进程是否仍在运行的服务的进程 ID。

    • 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 文件。