如何将自定义环境变量添加到docker-ejabberd

问题描述

我正在ECS上运行docker-ejabberd,并且一切正常。现在,我想用运行容器时传递给映像的环境变量替换ejabberd.yml文件上存在的my_sql用户/传递。即使在docker-ejabberd Wiki上,也没有关于如何简单地进行描述的明确方法。有人遇到类似的情况吗?

例如在ejabberd.yml中,我有以下部分:

sql_server: ${MysqL_SERVER}
sql_database: ${MysqL_DATABASE_NAME}
sql_username: ${MysqL_USERNAME}
sql_password: ${MysqL_PASSWORD}
sql_port: ${MysqL_PORT}

我想在docker run时将这些变量作为env变量传递,然后在容器运行之前将其替换。

侧面说明:我们正在使用ECS,并将变量通过任务定义传递而没有任何问题。

我遍历了一些主题,建议使用ENTRY_POINT命令运行脚本来替换文件,然后再运行容器,但不确定这是否是个好主意。

我还有一个想法,就是在构建映像之前以及在从git存储库获取代码并在AWS ECR上创建映像之前,替换CICD管道中此ejabberd.yml文件中的变量吗?

解决方法

我想用运行容器时传递给映像的环境变量替换ejabberd.yml文件中存在的my_sql用户/口令。

ejabberd.yml文件由yconf库(https://github.com/processone/yconf)读取和解析,我怀疑它是否支持这种东西。

我遍历了一些主题,建议使用ENTRY_POINT命令运行脚本来替换文件,然后再运行容器,但不确定这是否是个好主意。

按照该建议,如果您不想弄乱整个ejabberd.yml并让脚本对其进行操作,则可以确保仅对那些特定选项进行了参数设置:

您可以使用脚本在一个小文件中定义这些var,然后使用以下命令将该小文件中的选项包括到ejabberd.yml中 https://docs.ejabberd.im/admin/configuration/file-format/#include-additional-files

例如,在您的ejabberd.yml中,输入以下内容:

include_config_file:
  /etc/ejabberd/database.yml:
    allow_only: [sql_server,sql_database,sql_username,sql_password,sql_port]

然后编写您的脚本,该脚本会生成该小文件,例如:

$ generate-database-config.sh
$ cat /etc/ejabberd/database.yml
sql_server: "localhost"
sql_database: "ejaup"
sql_username: "ejabberd_test"
sql_password: "ejabberd_test"
sql_port: 3306