修改配置文件
替换配置文件中的变量¶
有时你可能有需要配置信息的模组或插件,这些信息只能在运行时获得。例如,如果你需要配置一个插件以连接到数据库,你不希望将这些信息包含在你的Git仓库或Docker镜像中。或者你可能有一些运行时信息,比如服务器名称,需要在容器启动后在配置文件中设置。
在这些情况下,可以选择用容器运行时定义的环境变量替换配置文件中定义的变量。
当环境变量REPLACE_ENV_IN_PLACE
设置为true
(默认值)时,启动脚本将遍历容器内/data
路径下的所有文件,并替换与容器环境变量匹配的变量。通过将REPLACE_ENV_DURING_SYNC
设置为true
(默认为false
),变量也可以(或另外)在从/plugins
、/mods
和/config
同步的文件中替换。
你想要替换的变量需要在花括号内声明,并以美元符号为前缀,例如${CFG_YOUR_VARIABLE}
,这与许多脚本语言相同。
你还可以更改REPLACE_ENV_VARIABLE_PREFIX
,其默认值为"CFG_",以限制允许使用的环境变量。例如,使用"CFG_"作为前缀,变量${CFG_DB_HOST}
将被替换,但${DB_HOST}
不会。前缀可以设置为空字符串,以允许匹配任何变量名。
如果你想使用文件内容作为值,例如在使用作为文件挂载的秘密时,在文件中声明与正常名称相同的占位符,并声明一个名称相同但带有_FILE
后缀的环境变量。
例如,my.cnf
文件可能包含:
...在compose文件中声明的隐私变量:
...最后,环境变量将以_FILE
后缀命名,并指向挂载的隐私变量:
变量将在具有以下扩展名的文件中替换:
.yml
, .yaml
, .txt
, .cfg
, .conf
, .properties
.
可以通过在变量REPLACE_ENV_VARIABLES_EXCLUDES
中列出其名称(不带路径)来排除特定文件。
可以通过在变量REPLACE_ENV_VARIABLES_EXCLUDE_PATHS
中列出路径来排除路径。路径排除是递归的。这里是一个示例:
这里是一个完整的示例,我们希望在database.yml
中替换值。
这是你的docker-compose.yml
文件可能的样子:
# 其他docker-compose示例在/examples中
services:
minecraft:
image: itzg/minecraft-server
ports:
- "25565:25565"
volumes:
- "mc:/data"
environment:
EULA: "TRUE"
ENABLE_RCON: "true"
RCON_PASSWORD: "testing"
RCON_PORT: 28016
# 启用环境变量替换
REPLACE_ENV_VARIABLES: "TRUE"
# 定义你想要替换的环境变量的可选前缀
ENV_VARIABLE_PREFIX: "CFG_"
# 这里是实际的变量
CFG_DB_HOST: "http://localhost:3306"
CFG_DB_NAME: "minecraft"
CFG_DB_PASSWORD_FILE: "/run/secrets/db_password"
volumes:
mc:
rcon:
secrets:
db_password:
file: ./db_password
修补现有文件¶
通过将变量PATCH_DEFINITIONS
设置为包含一个或多个修补定义json文件或修补集json文件的目录路径,可以对一个或多个现有文件应用基于JSON路径的修补。
修补定义中的file
和value
字段可能包含${...}
变量占位符。可以通过设置REPLACE_ENV_VARIABLE_PREFIX
(默认为"CFG_")来限制占位符中允许的环境变量。
以下示例显示了一个修补集文件,其中可以修改和添加paper.yaml
配置文件中的各种字段:
{
"patches": [
{
"file": "/data/paper.yml",
"ops": [
{
"$set": {
"path": "$.verbose",
"value": true
}
},
{
"$set": {
"path": "$.settings['velocity-support'].enabled",
"value": "${CFG_VELOCITY_ENABLED}",
"value-type": "bool"
}
},
{
"$put": {
"path": "$.settings",
"key": "my-test-setting",
"value": "testing"
}
}
]
}
]
}
支持的文件格式:
- JSON
- JSON5
- Yaml
- TOML,但处理后的输出不美观