在尝试使用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。
感谢任何帮助或指导。
答案 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