【发布时间】:2022-01-15 08:02:53
【问题描述】:
我对 Elixir 很陌生。我已经构建了一个在本地运行的应用程序,效果很好。但现在我需要用 Docker 为它构建一个容器。
但是,每次发布的尝试似乎都是尝试连接到 RabbitMQ(在本地运行,作为 Docker 容器)。
我不希望,不能在每次构建此容器时尝试连接到 Rabbit,因为它需要由 CI / CD 管道构建,并且永远无法访问任何 Rabbit。我已经使用 ENV 对其进行了设置,但是在部署到我的 k8s 集群时需要在我的 YAML 中进行设置。
这就是 Dockerfile:
# Container Base Image
FROM elixir:1.13.1-alpine as release_build
# Set Working Folder
WORKDIR app
#ENV RABBIT_CONNECTION=""
# Copy Source Code Into Container
COPY ./src/app ./
# Install Hex Package Manager
RUN mix local.hex --force
# Install Rebar
RUN mix local.rebar --force
# Get All Deps
RUN mix deps.get
RUN mix deps.compile
# Compile Application
RUN mix compile
那么您是否可以看到我设置了带有 Rabbit 连接 URL 的 ENV(当前已注释掉)。在这种状态下,我得到,
The following arguments were given to AMQP.Connection.open/1:
如果我设置它,但只设置为一个空字符串,我会得到,
no match of right hand side value: {:error, {{:unable_to_parse_uri, :no_scheme}, []}}
我也尝试使用本地运行的容器的有效 URL,但它是否使用 localhost 和不同的 Docker 网络,这只是返回了 econnrefused 错误。
这就是我在我的应用中连接到 Rabbit 的方式,
rabbit_url = Application.fetch_env!(:rabbit, :url)
# Open Connection To Rabbit
{:ok, connection} = AMQP.Connection.open(rabbit_url)
{:ok, channel} = AMQP.Channel.open(connection)
这是兔子配置文件部分,
配置:兔子, url: System.get_env("RABBIT_CONNECTION")
我制作了一个小的本地 Bash 脚本来启动它,
RABBIT_CONNECTION='amqp://admin:password@localhost:5672' iex -S mix
这个脚本可以很好地与应用程序一起启动并连接到我本地运行的 RabbitMQ 容器
所以我知道必须有一种方法可以让代码在没有连接的情况下进行发布,无论是到 Rabbit 还是数据库或类似的东西。
欢迎任何帮助
谢谢,
【问题讨论】:
-
好的,我知道在运行时读取 ENV,有什么最好的方法吗?
标签: docker elixir elixir-mix