我想在生产环境中使用一个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的解决方案吗?
2条答案
按热度按时间xghobddn1#
Elixir 1.9在Mix中增加了“release”的概念(这个版本是在最初提出这个问题的11个月后发布的)。运行
mix release
将生成一个树,其中包含BEAM运行时、您编译的应用程序及其所有依赖项。这就是extensive documentation for themix release
task on hexdocs.pm。在Docker上下文中,您可以将其与multi-stage build结合起来,以完全满足您的请求:从完整的
elixir
映像开始,创建一个包含运行映像所需的最小值的树,然后将其COPY
到一个运行时映像中。如果你正在使用Phoenix,Phoenix文档有一个更长的例子。另一方面,它的运行时映像似乎有一些不必要的东西。2该页也有一些关于运行Ecto迁移的有用讨论;使用这里描述的Elixir片段,您可以
docker run
一个临时容器来执行迁移,在入口点 Package 器脚本中运行它们,或者使用任何其他普通的Docker技术。siotufzp2#
我建议您使用distillery来构建二进制文件。
然后运行一个
alpine
容器,将distillery release
挂载到它上面,运行二进制文件。是的,你甚至可以使用管理程序来运行它。你可以使用
remote_console
of distilery链接到这个二进制文件的控制台。