Phoenix 生产配置重新加载问题
Phoenix production config reloading problems
我有适用于 heroku 的 Phoenix 应用程序。我们想将其移至 DO。我们将使用 docker。
我尝试在我的本地机器上使用 docker-compose 创建 docker 图像。如果我用 MIX_ENV=dev
来做,一切都很好。如果我将 MIX_ENV
设置为 prod
我有问题。
上一个 prod.exs:
use Mix.Config
config :myapp, Myapp.Endpoint,
http: [port: {:system, "PORT"}],
url: [scheme: "https", host: "myapp.herokuapp.com", port: 443],
force_ssl: [rewrite_on: [:x_forwarded_proto]],
cache_static_manifest: "priv/static/manifest.json",
secret_key_base: System.get_env("SECRET_KEY_BASE")
config :logger, level: System.get_env("LOG_LEVEL") || :info
config :myapp, Myapp.Repo,
adapter: Ecto.Adapters.Postgres,
url: System.get_env("DATABASE_URL"),
pool_size: 20,
ssl: true
prod.secret.exs 仅包含 DB
的凭据
现在:
prod.exs
# I changed only endpoint:
config :myapp, Myapp.Endpoint,
http: [port: {:system, "PORT"}],
ssl: false, # I replaced previous 3 lines with this...
secret_key_base: System.get_env("SECRET_KEY_BASE")
问题
当我运行docker-compose up --build
它有效 returns:
web_1 | 20:29:07.073 [info] Running Myapp.Endpoint with Cowboy using http://localhost:4000
但是!当我做:
$ curl $(docker-machine ip default):4000
它returns没什么...
如果我在浏览器中转到 192.168.99.100:4000,它会将我重定向到 https://myapp.herokuapp.com
docker 会保存我之前的配置吗?我试图删除更新 Dockerfile 时构建的所有实验图像。它没有帮助:(
这是怎么回事?有什么建议吗?
P.S。
我的 Dockerfile
FROM trenpixster/elixir:1.2.5
COPY . /app
WORKDIR /app
RUN mix local.hex --force
RUN mix local.rebar --force
RUN mix do deps.get
RUN touch config/prod.exs
ENV PORT 4000
ENV MIX_ENV prod
RUN mix compile
EXPOSE 8080
EXPOSE 8443
ENTRYPOINT ["mix", "phoenix.server"]
我的docker-compose.yml
version: '2'
services:
web:
build: .
ports:
- "4000:4000"
volumes:
- .:/app
depends_on:
- db
db:
image: postgres:9.4.8
嗯,你试过了吗mix clean
?
好的。感谢@aaron-tinio 的回答。它部分解决了我的问题。第二部分是 ENV 变量......
System.get_env("SECRET_KEY_BASE") 在我的 ENV 中不存在,这可能会阻止 Phoenix ENV 的更改(我不确定)。但是我没有看到任何 notifications/exceptions/warnings:(
为了解决这个问题,我从我的本地控制台使用 MIX_ENV=prod mix phoenix.server
(没有 docker)。在这种情况下,我看到了错误(感谢我的朋友 - @alg)。
我有适用于 heroku 的 Phoenix 应用程序。我们想将其移至 DO。我们将使用 docker。
我尝试在我的本地机器上使用 docker-compose 创建 docker 图像。如果我用 MIX_ENV=dev
来做,一切都很好。如果我将 MIX_ENV
设置为 prod
我有问题。
上一个 prod.exs:
use Mix.Config
config :myapp, Myapp.Endpoint,
http: [port: {:system, "PORT"}],
url: [scheme: "https", host: "myapp.herokuapp.com", port: 443],
force_ssl: [rewrite_on: [:x_forwarded_proto]],
cache_static_manifest: "priv/static/manifest.json",
secret_key_base: System.get_env("SECRET_KEY_BASE")
config :logger, level: System.get_env("LOG_LEVEL") || :info
config :myapp, Myapp.Repo,
adapter: Ecto.Adapters.Postgres,
url: System.get_env("DATABASE_URL"),
pool_size: 20,
ssl: true
prod.secret.exs 仅包含 DB
的凭据现在:
prod.exs
# I changed only endpoint:
config :myapp, Myapp.Endpoint,
http: [port: {:system, "PORT"}],
ssl: false, # I replaced previous 3 lines with this...
secret_key_base: System.get_env("SECRET_KEY_BASE")
问题
当我运行docker-compose up --build
它有效 returns:
web_1 | 20:29:07.073 [info] Running Myapp.Endpoint with Cowboy using http://localhost:4000
但是!当我做:
$ curl $(docker-machine ip default):4000
它returns没什么...
如果我在浏览器中转到 192.168.99.100:4000,它会将我重定向到 https://myapp.herokuapp.com
docker 会保存我之前的配置吗?我试图删除更新 Dockerfile 时构建的所有实验图像。它没有帮助:(
这是怎么回事?有什么建议吗?
P.S。 我的 Dockerfile
FROM trenpixster/elixir:1.2.5
COPY . /app
WORKDIR /app
RUN mix local.hex --force
RUN mix local.rebar --force
RUN mix do deps.get
RUN touch config/prod.exs
ENV PORT 4000
ENV MIX_ENV prod
RUN mix compile
EXPOSE 8080
EXPOSE 8443
ENTRYPOINT ["mix", "phoenix.server"]
我的docker-compose.yml
version: '2'
services:
web:
build: .
ports:
- "4000:4000"
volumes:
- .:/app
depends_on:
- db
db:
image: postgres:9.4.8
嗯,你试过了吗mix clean
?
好的。感谢@aaron-tinio 的回答。它部分解决了我的问题。第二部分是 ENV 变量......
System.get_env("SECRET_KEY_BASE") 在我的 ENV 中不存在,这可能会阻止 Phoenix ENV 的更改(我不确定)。但是我没有看到任何 notifications/exceptions/warnings:(
为了解决这个问题,我从我的本地控制台使用 MIX_ENV=prod mix phoenix.server
(没有 docker)。在这种情况下,我看到了错误(感谢我的朋友 - @alg)。