フェニックスでアプリケーションの構築が完了し、それを他の世界と共有する準備ができたと想像してください。発行環境を正確にどのようにナビゲートすればよいのか、またアプリケーションをどこに発行すればよいのか疑問に思われるかもしれません。
つまり、Docker を使用してどこにでもプロジェクトを公開できます。Elixir は、BEAM を起動するために、いくつかのランタイム依存関係 (主に Erlang) を必要とします。Phoenix リリース ドキュメントの「デプロイメント用のバージョンの使用」セクションに、優れた Dockerfile が用意されています。「Windows 11 で Edge が更新されない問題を修正するには?」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} としてビルダー # ビルドの依存関係をインストールします RUN apt-get update -y && apt-get install -y build-essential git nodejs npmcurl \ && apt-get clean && rm -f /var/lib/apt/lists /*_* RUN カール -fsSL https://deb.nodesource.com/setup_18.x | bash - \ && apt-get install -y nodejs # ビルドディレクトリ WORKDIR /appを準備します
上記のコードには、Node.js、npm、cURL など、必要な依存関係のほとんどが含まれています。ただし、他にも必要な場合は、ここに追加できます。すべてのイメージで Node.js を追加する必要があるわけではないため、必要に応じてこの手順を削除できることに注意してください。
これでセットアップが完了します。ここからはアプリケーションに関する話になります。
# hex + rebar をインストール RUN mix local.hex --force && \ mix local.rebar --force # set build ENV ENV MIX_ENV="prod" # ミックスの依存関係をインストール COPY mix.exs mix.lock ./ RUN mix deps.get --only $MIX_ENV RUN mkdir config # 依存関係をコンパイルする前にコンパイル時設定ファイルをコピーします# 関連する設定変更が依存関係 の再コンパイルをトリガーするよう に # します。 COPY config/config.exs config/${MIX_ENV}.exs config/ RUN mix deps.compile COPY priv priv COPY lib lib COPY アセット アセット WORKDIR アセット RUN ノード --バージョン RUN 糸インストール WORKDIR ../ RUN npm i -g 糸; 糸セットのバージョンが安定しました # アセットをコンパイルする RUN mixassets.deploy # リリースをコンパイルする RUN mix COMPILE
まず、mix を使用して Rebar v3 と Hex をインストールします。Rebar はネイティブ Erlang ライブラリを処理しますが、mix は Elixir 依存関係をフェッチします。Node.js の npm と比較できます。次に、プロジェクトへの依存関係を表すミックスファイルを、ソース コード内のロックファイルと構成とともにコピーします。
次に、すべての依存関係を取得してコンパイルします。これは依存関係のみをコンパイルし、プロジェクト ファイルはコンパイルしないことに注意してください。これらは 2 つの別個の手順です。最後に、プロジェクト ファイルをコピーします。
-
priv: マイグレーションと静的ファイル
-
lib: ソースコード
-
アセット: JavaScript および CSS コード
次の 5 つのステップはオプションです。Node.js と npm を使用している場合は、フォルダーに変更し、Yarn または npm を使用して依存関係をインストールし、.workdir assets
workdir``src/に変更します。
この時点で、アセットをデプロイできます。これは、すべての JavaScript ファイルと CSS ファイルをデプロイできるようにする特別なステップです。
次に、Elixir ソース コードの残りの部分をコンパイルし、プロジェクト内のすべてのファイルを最終ビルド ステップ (リリース ビルド) に向けて準備します。
# config/runtime.exs を変更してもコードを再コンパイルする必要はありません COPY config/runtime.exs config/ COPY rel rel RUN mix release
コンパイルステップの後にランタイム構成をどのようにコピーするかに注目してください。これは、他のすべての構成ファイル内のすべての構成がビルドにコンパイルされるため、現時点では変更できないことを思い出させるのに役立ちます。ただし、名前が示すように、ランタイム構成の構成は実行時に読み取られます。
RUN mix release は、アプリケーションの実行に必要なものすべてを含むリリース ファイルを構築します。
ランタイムステップ
# 最終イメージに # コンパイルされたリリースとその他のランタイムに必要なもののみが含まれるように、新しいビルド ステージを開始します。 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/*_* # ロケールを設定します 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 nothing /app # setrunner ENV ENV MIX_ENV="prod" # 最終リリースのみをコピーしますビルドステージ COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/myapp ./ USER 誰も CMD ["/app/bin/server"]
繰り返しますが、上記のコードは Phoenix の公式ドキュメントから引用したものですが、コメントがどこで中断されたのかをもう一度明確にします。
ここでは前回のものを参照しますが、今回は Linux イメージのみを取得します。これ自体で、ランタイム Docker イメージが驚くほど小さくなります。ARGS
初期インストールや混合パッケージなどのセットアップのもう 1 つの利点は、Elixir アプリケーションを実行するために必要なのは、ビルド セクションの最後のステップで作成したバイナリのみであり、特にビルド イメージのサイズが小さくなることです。node_modules「ミックスリリース」
すべてのユーザーにアプリ ディレクトリへのアクセスを許可し、ユーザーを厳密に制限されたユーザーに変更して、アプリを実行します。
結論は
この記事の手順は長いですが、基本的には実行できる次の 1 つのコマンドに要約されます。
> phx.gen.release --docker をミックスする
上記のコードは、この記事で説明したものと同様の Dockerfile を生成しますが、いくつかの違いがあります。標準の Phoenix プロジェクトは Node.js を使用しないため、この Dockerfile に含めた Node.js のステップは含まれていません。
この Dockerfile は、Phoenix アプリケーションをデプロイするための開始点として使用されます。この記事では、ニーズに合わせて Dockerfile を変更する方法を示します。この例には、npm と Node.js のステップが含まれています。ここからは、いろいろ試して、どの詳細が必要かを判断するだけです。
ジェネレーター イメージとランタイム イメージを別々に持つことの優れた点は、ジェネレーター イメージ内に多量のデータがあっても実際のコストがかからないことです。はい、これによりビルドが遅くなりますが、これらのほとんどはパイプラインにキャッシュでき、自動的にローカルにキャッシュされます。いずれにしても、ランタイム イメージはベアボーン Linux ディストリビューションであるため、サイズが小さく、リリースが速くなります。