在尝试使用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和mix release来获取我的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。
任何帮助或指导我们都将不胜感激。
发布于 2018-07-04 10:00:25
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
https://stackoverflow.com/questions/50995713
复制相似问题