我對 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)
這是兔子組態檔部分,
配置:兔子,網址:System.get_env(“RABBIT_CONNECTION”)
我制作了一個本地 Bash 腳本來啟動它,
RABBIT_CONNECTION='amqp://admin:password@localhost:5672' iex -S mix
此腳本適用于應用程式以啟動并連接到我本地運行的 RabbitMQ 容器
所以我知道必須有一種方法可以讓代碼在沒有連接的情況下進行發布,無論是到 Rabbit 還是資料庫或類似的東西。
任何幫助都是最受歡迎的
謝謝,
uj5u.com熱心網友回復:
我試圖創建一個像你這樣的專案。
mix new broker_client
在mix.exs應用程式功能配置為運行我的模塊的啟動功能。
def application do
[
extra_applications: [:logger],
mod: {BrokerClient, []}
]
end
此外,在config/runtime.exs中,我正在使用此處記錄的連接和一個或多個通道配置amqp。
import Config
config :amqp,
connections: [
myconn: [url: System.get_env("BROKER_URL")]
],
channels: [
mychan: [connection: :myconn]
]
在lib/broker_client.ex中,我實作了 start 函式,它創建了一個簡單的任務,如本答案所示。
defmodule BrokerClient do
def sample() do
{:ok, chan} = AMQP.Application.get_channel(:mychan)
:ok = AMQP.Basic.publish(chan, "", "", "Hello")
Process.sleep(1000 * 10)
end
def start(_type, _args) do
IO.puts("starting...")
Task.start(fn -> sample() end)
end
end
我可以在沒有本地運行 rabbitmq 或設定變數代理的情況下構建它。
FROM elixir as builder
WORKDIR /app
RUN mix local.hex --force && mix local.rebar --force
COPY mix.exs mix.lock ./
RUN mix deps.get --only prod
COPY ./ .
RUN MIX_ENV=prod mix release
FROM debian:stable-slim
ENV LANG="C.UTF-8" LC_AL="C.UTF-8" PATH="/app/bin:$PATH"
COPY --from=builder /app/_build/prod/rel/broker_client /app
CMD [ "broker_client", "start"]
現在我可以用 docker-compose 作為例子來運行它。
version: '3.9'
services:
client:
build: ./
environment:
BROKER_URL: 'amqp://guest:guest@rabbitmq'
# sleep 10 seconds to give the broker time to start
command: [ "sh", "-c", "sleep 10 && broker_client start" ]
depends_on:
- rabbitmq
rabbitmq:
image: rabbitmq
查看Application的官方檔案可能也很有用。
uj5u.com熱心網友回復:
您需要使用運行時配置,否則必須在編譯時傳遞配置,為此您所要做的就是添加runtime.exs并在那里獲取環境變數:
config :rabbit, url: System.get_env("RABBIT_CONNECTION")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/411638.html
標籤:
