使用 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定义不同,因为它会等待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,则poststart命令会在start命令创建分支后执行。否则,这些命令将在执行start命令后立即执行。command:指定用于执行操作的命令。
shell(可选):默认情况下,所有命令都在/bin/shshell 中执行。您可以选择将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_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文件。