使用 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/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
文件添加服务,请按照以下步骤操作:
在文本编辑器中打开
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
文件。