如何使用Erlang和Docker来运行Phoenix应用程序?

wbgh16ku  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(162)

我想在生产环境中使用一个Docker映像来运行Phoenix容器,但是,由于Elixir只是Erlang之上的一层,因此让Elixir在我的生产环境中运行可能会浪费空间。
理想的情况是,我能够将整个Phoenix应用程序编译成Erlang,然后使用来自Erlang:alpine的映像在生产环境中运行该应用程序。

FROM elixir:alpine as builder
(install dependencies and copy files)
RUN mix compile_app_to_erlang

FROM erlang:alpine
COPY --from=builder /path/to/compiled/erlang /some/other/path
CMD ["erlang", "run"]

注意:compile_app_to_erlang不是一个真实的的命令,但我正在寻找类似的命令。另外,我不知道erlang是如何运行的,所以这里的所有代码都是完全虚构的。
另外,据我所知,有一个叫做蒸馏厂的项目可以做到这一点,但这似乎是一种不应该太复杂的事情(如果我知道erlang是如何工作的),如果我没有其他依赖项,我宁愿不依赖。另外,如果你使用蒸馏厂,你也必须使用定制的docker图像来运行代码,这是我试图避免的。
像这样的事情甚至是可能的吗?如果是的话,有人知道一个DIY的解决方案吗?

xghobddn

xghobddn1#

Elixir 1.9在Mix中增加了“release”的概念(这个版本是在最初提出这个问题的11个月后发布的)。运行mix release将生成一个树,其中包含BEAM运行时、您编译的应用程序及其所有依赖项。这就是extensive documentation for the mix release task on hexdocs.pm
在Docker上下文中,您可以将其与multi-stage build结合起来,以完全满足您的请求:从完整的elixir映像开始,创建一个包含运行映像所需的最小值的树,然后将其COPY到一个运行时映像中。

FROM elixir:1.13 AS build
WORKDIR /build
ENV MIX_ENV=prod

# Install two tools needed to build other dependencies.
RUN mix do local.hex --force, local.rebar --force

# Download dependencies.
COPY mix.exs mix.lock ./
RUN mix deps.get --only prod

# Compile dependencies (could depend on config/config.exs)
COPY config/ config/
RUN mix deps.compile

# Build the rest of the application.
COPY lib/ lib/
COPY priv/ priv/
RUN mix release --path /app

FROM ubuntu:20.04

# Get the OpenSSL runtime library
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      libssl1.1

# Get the compiled application.
COPY --from=build /app /app
ENV PATH=/app/bin:$PATH

# Set ordinary metadata to run the container.
EXPOSE 4000
CMD ["myapp", "start"]

如果你正在使用Phoenix,Phoenix文档有一个更长的例子。另一方面,它的运行时映像似乎有一些不必要的东西。2该页也有一些关于运行Ecto迁移的有用讨论;使用这里描述的Elixir片段,您可以docker run一个临时容器来执行迁移,在入口点 Package 器脚本中运行它们,或者使用任何其他普通的Docker技术。

siotufzp

siotufzp2#

我建议您使用distillery来构建二进制文件。
然后运行一个alpine容器,将distillery release挂载到它上面,运行二进制文件。是的,你甚至可以使用管理程序来运行它。
你可以使用remote_console of distilery链接到这个二进制文件的控制台。

相关问题