如何使用 Docker 运行 Phoenix 应用程序

想象一下,您刚刚在 Phoenix 中构建完一个应用程序,现在,您已准备好与世界其他地方共享它。您可能想知道如何准确导航发布环境以及在哪里发布应用程序。

简而言之,您可以使用 Docker 在任何地方发布您的项目。Elixir需要一些运行时依赖关系,主要是Erlang,以便启动BEAM。在 Phoenix 发布文档的“使用版本进行部署”部分中,有一个出色的 Dockerfile 可用,如何修复Edge浏览器在Windows11无法更新问题?8种解决方法可作为一个很好的起点。在本教程中,我将剖析这个 Dockerfile 并解释每个步骤的作用,使您能够选择您喜欢的部分,以及可能需要更改哪些部分来满足您自己的项目需求。让我们开始吧!

  • 开始

  • 构建步骤

  • 运行时步骤

开始

作为预告片,我将在这篇文章中包含 Node.js 和 npm,它们不包含在文档中的官方 Dockerfile 中:

ARG ELIXIR_VERSION=1.14.0
ARG OTP_VERSION=25.0.3
ARG DEBIAN_VERSION=bullseye-20210902-slim
ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}"
ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}"

在上面的代码中,我们分别定义每个步骤,如何修复Chrome中的Err_Cache_Miss错误?9个简单方法这将在本教程的后面部分更有意义。现在,我们定义我们想要编译的Elixir版本,我们想要的Erlang OTP版本,以及我们想要作为主力的Linux映像。

构建步骤

我们将从使用构建器映像开始:

FROM ${BUILDER_IMAGE} as builder
# install build dependencies
RUN apt-get update -y && apt-get install -y build-essential git nodejs npm curl \
  && apt-get clean && rm -f /var/lib/apt/lists/*_*
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
  && apt-get install -y nodejs
# prepare build dir
WORKDIR /app

上面的代码包括我们需要的大多数依赖项,如 Node.js、npm 和 cURL。但是,如果您需要其他的,可以在此处添加它们。请记住,趣知笔记并非每个映像都需要添加 Node.js,因此您可以根据需要删除此步骤。

这负责设置。从现在开始,一切都与我们的应用程序有关:

# install hex + rebar
RUN mix local.hex --force && \
  mix local.rebar --force
# set build ENV
ENV MIX_ENV="prod"
# install mix dependencies
COPY mix.exs mix.lock ./
RUN mix deps.get --only $MIX_ENV
RUN mkdir config
# copy compile-time config files before we compile dependencies
​
# to ensure any relevant config change will trigger the dependencies
# to be re-compiled.
COPY config/config.exs config/${MIX_ENV}.exs config/
RUN mix deps.compile
COPY priv priv
COPY lib lib
COPY assets assets
WORKDIR assets
RUN node --version
RUN npm i -g yarn; yarn set version stable
RUN yarn install
WORKDIR ../
# compile assets
RUN mix assets.deploy
# Compile the release
RUN mix compile

首先,我们使用 mix 来安装 Rebar v3 和 Hex。Rebar 处理原生 Erlang 库,而 mix 获取我们的 Elixir 依赖项;你可以将它与 Node.js 的 npm 进行比较。然后,我们复制我们的 mixfile,它表示我们对项目的依赖关系,以及源代码中的锁文件和配置。

然后,我们获取所有依赖项并编译它们。趣知笔记网站地图请注意,这仅编译依赖项,而不是我们的项目文件;这是两个独立的步骤。最后,我们复制我们的项目文件:

  • priv:迁移和静态文件

  • lib: 我们的源代码

  • assets:我们的 JavaScript 和 CSS 代码

接下来的五个步骤是可选的。如果您使用的是 Node.js 和 npm,请将 更改为文件夹,使用 Yarn 或 npm 安装依赖项,然后将 更改为 .workdirassetsworkdir``src/

此时,我们可以部署我们的资产,这是一个特殊的步骤,使我们的所有 JavaScript 和 CSS 文件都准备好进行部署。

接下来,我们编译Elixir源代码的其余部分,使项目中的每个文件都为最后的构建步骤(发布版本)做好准备:

# Changes to config/runtime.exs don't require recompiling the code
COPY config/runtime.exs config/
COPY rel rel
RUN mix release

请注意我们如何在编译步骤之后复制运行时配置。这是一个很好的提醒,每个其他配置文件中的所有配置都编译到版本中,因此此时无法更改。但是,顾名思义,运行时配置中的配置是在运行时读取的。

RUN mix release将构建一个发布文件,其中包含运行应用程序所需的一切。

运行时步骤

# start a new build stage so that the final image will only contain
# the compiled release and other runtime necessities
FROM ${RUNNER_IMAGE}
RUN apt-get update -y && apt-get install -y libstdc++6 openssl libncurses5 locales \
  && apt-get clean && rm -f /var/lib/apt/lists/*_*
# Set the locale
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
WORKDIR "/app"
RUN chown nobody /app
# set runner ENV
ENV MIX_ENV="prod"
# Only copy the final release from the build stage
COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/myapp ./
USER nobody
CMD ["/app/bin/server"]

同样,上面的代码是从 Phoenix 官方文档中提取的,但我会再次澄清评论的不足之处。

在这里,我们引用了我们之前的 ,但这一次,我们只采用 Linux 映像。这本身就使我们的运行时 Docker 映像异常小。ARGS

我们早期安装、混合包等设置的另一个好处是,要运行我们的 Elixir 应用程序,我们只需要在构建部分结束时从我们的步骤创建的二进制文件,从而特别减小了构建映像的大小。node_modules``mix release

我们允许每个人访问我们的应用目录,将我们的用户更改为严格限制的用户,然后运行应用。

结论

尽管本文中的步骤很长,但基本上,它归结为可以运行的以下单个命令:

> mix phx.gen.release --docker

上面的代码将生成一个类似于我们在本文中介绍的 Dockerfile,但有一些差异。标准的 Phoenix 项目不使用 Node.js,因此,它不包括我在此 Dockerfile 中包含的 Node.js 步骤。

此 Dockerfile 用作部署 Phoenix 应用程序的起点,在本文中,我展示了如何更改它以满足您的需求。在本例中,我们包含了 npm 和 Node.js 步骤。从这里开始,您需要做的就是四处玩转并弄清楚您需要哪些细节。

拥有单独的生成器和运行时映像的酷之处在于,在生成器映像中包含太多数据不会产生实际成本。是的,这会减慢构建速度,但其中大多数内容都可以缓存在管道中,并且在本地自动缓存。无论如何,您的运行时映像将很小且发布速度很快,因为它是准系统Linux发行版。

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/132650796