酿酒厂不替换systemd版本中的变量

时间:2018-06-22 21:17:17

标签: elixir systemd distillery

在尝试使用Distillery在运行时获取系统变量时遇到问题。目前,我已将与数据库的连接定义为:

config :myapp, MyApp.Repo,
  adapter: Ecto.Adapters.Postgres,
  timeout: 2000000,
    username: "${DB_USER}",
    password: "${DB_PASSWORD}",
    database:  "${DB_DATABASE}",
    hostname: "${DB_HOST}",
   port: 5432,
  pool_size: 10

然后,我正在运行phx.digest并混合发布以获取我的tar文件。然后,我使用在设置了所有环境变量的ubuntu服务器上运行的systemd配置部署此tar文件。这些是systemd服务的重要内容:

[Service]
Type=forking
WorkingDirectory=/opt/app
User=ubuntu
RemainAfterExit=yes
Restart=on-failure
RestartSec=5
Environment=MIX_ENV=stage "PORT=4000"
Environment=LANG=en_US.UTF-8
Environment=REPLACE_OS_VARS=true
EnvironmentFile=/etc/profile
ExecStart=/opt/app/bin/myapp migrate-start
ExecStop=/opt/app/bin/myapp stop
ExecReload=/opt/app/bin/myapp restart
SyslogIdentifier=myapp

当我尝试在服务器实例上运行此服务时。它正在尝试连接到$ {DB_HOST}:5432作为URL,并且没有评估我是否不想将其替换为配置的值。在使用硬编码值之前,我已经成功运行了此程序,因此我知道问题出在替换值上。有人对我如何解决此错误有任何建议吗?我在服务器上设置了所有必要的值,包括再次设置REPLACE_OS_VARS = true。

感谢任何帮助或指导。

1 个答案:

答案 0 :(得分:0)

REPLACE_OS_VARS设置是用于插入“正常”环境变量的帮助器,但是在构建时而不是运行时

这里的数据库配置值可以很好地使用帮助程序,因为您可能需要在应用程序启动时连接到数据库。限制是它们将无法访问或获取运行tar的计算机上的任何环境变量。

我通常会有一个.env文件,其中包含我在构建时想要的所有环境变量。

# .env contents

 export REPLACE_OS_VARS=true
 export DB_HOSTNAME="postgres"
...

比发行版的构建过程看起来像这样:

$ MIX_ENV=prod
$ source .env
$ mix deps.get
$ mix deps.compile
$ mix phx.digest
$ mix release

这意味着您需要具有REPLACE_OS_VARS=true注入的“环境”变量,这些变量在构建发行版的计算机上都是可用的,而不是在接收构建的tar的计算机上可用的变量。或使用其他配置管理解决方案。

这是我刚开始时对我有帮助的资源:https://hexdocs.pm/distillery/getting-started.html#application-configuration