如何使用带有Docker的Erlang来运行Phoenix应用程序



我想在生产环境中使用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是如何工作的(,如果我没有,我宁愿不依赖另一种依赖。此外,如果你使用distillery,你还必须使用定制的docker图像来运行代码,这是我尽量避免的。

这样的事情可能吗?如果是的话,有人知道DIY解决方案吗?

Elixir 1.9添加了";释放";混合。(这是在最初提出这个问题大约11个月后发布的。(运行mix release将生成一个包含BEAM运行时、编译的应用程序及其所有依赖项的树。在hexdocs.pm上有关于mix release任务的大量文档。

在Docker上下文中,您可以将其与多阶段构建相结合,以完全满足您的要求:从完整的elixir映像开始,创建一个包含运行映像所需的最小值的树,并将其COPY转换为运行时映像。我一直在使用Dockerfile,比如:

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文档中有一个更长的示例。一方面,它涵盖了一些细节,如资产汇编;另一方面,它的运行时映像中的内容似乎比必要的要多。该页面还对运行Ecto迁移进行了一些有用的讨论;有了这里描述的Elixir片段,您可以docker run作为一个临时容器来进行迁移,在入口点包装器脚本中运行它们,或者使用任何其他普通的Docker技术。

我建议您使用distillery来构建二进制文件。

然后只需运行一个alpine容器,将distillery release装载到其中,运行二进制文件。是的,你可以使用监管者来运行它。

您可以使用distillery的remote_console链接到该二进制文件的控制台。

最新更新