2016-09-18 4 views
0

です:コンパイルエラー:Phoenix.Socket .__構造体__/0ドッカー作曲新鮮なセットアップを実行しているとき、私たちは、コンパイルにこのエラーが表示未定義

== Compilation error on file lib/phoenix/token.ex == 
** (CompileError) lib/phoenix/token.ex:144: Phoenix.Socket.__struct__/0 is undefined, cannot expand struct Phoenix.Socket 
    (stdlib) lists.erl:1354: :lists.mapfoldl/3 
could not compile dependency :phoenix, "mix compile" failed. You can recompile this dependency with "mix deps.compile phoenix", update it with "mix deps.update phoenix" or clean it with "mix deps.clean phoenix" 

アイム理由は分かりません。 /deps/phoenix/lib/phoenix/token.ex/socket.exを見ると、なぜこのようなことが起こっているのかはわかりません。

これはElixir 1.3.2とPhoenix 1.2.0です。

+1

Docker内でphoenixアプリケーションを実行しているとお伝えします。あなたはDockerマウント( 'docker -v" $ PWD ":/ app ...'のように)を使って開発で使用しているのと同じアプリケーションフォルダを使用していますか?そうであれば、Phoenixは別のプラットフォームでコンパイルされた '。/ build'フォルダのあらかじめ構築された成果物を使用している可能性があります。 – potz

+0

@PotiguarFaga私たちはDocker Composeを使用していますので、 'docker-compose.yml'は同じアプリケーションフォルダを使用します。エンドユーザがホストマシン上で通常のコンパイルを行っていても、Docker経由でも使用しようとしているというのは正しいかもしれません。 –

答えて

0

docker-compose.ymlがドッカーコンテナ内にアプリケーションフォルダをマウントしていることを確認したので、同様のシナリオでいくつかのコンパイルの問題を解決した方法をさらに詳しく説明します。これはあなたが尋ねている特定のエラーには対処しませんが、あなたの問題に対するより適切な答えを見つけるための指針として役立つかもしれません。

私はMac OS/X上で開発し、docker debianベースのイメージを使用してPhoenix Frameworkプロジェクトを構築します。私はdocker -v "$PWD":/app -w /app potz/elixir-build mix phoenix.serverpotz/elixir-buildは私がいくつかのものがプリインストールされているちょうどカスタム画像です)経由でコンテナの中にアプリケーションフォルダをマウントします。これは問題があります。なぜなら、フェニックスがコンテナ内で実行されると、あらかじめコンパイルされた成果物を持つ_buildディレクトリがあり、それを使用しようとしますが、もちろん、別のプラットフォームに構築されているため、あらゆる種類の奇妙なコンパイルエラーメッセージがスローされます/バツ)。また、依存関係は./depsフォルダーに保存され、OS/Xでもあらかじめコンパイルされています。

問題の解決方法は、同じアプリケーションソースファイルを使用しながら、2つの環境を効果的に分離し、ビルド成果物と依存関係の両方に異なるフォルダを使用するようにドッキングするように指示することです。私は、環境変数で上書きするmix.exsbuild_pathdeps_path設定できるようにする必要があることを行うためには:

# /build and /deps can be folders inside the container, 
# or mounted volumes, whatever makes sense to your specific setup 
docker run -v "$PWD":/app -w /app -e BUILD_PATH=/build -e DEPS_PATH=/deps potz/elixir-build mix phoenix.server 
:ドッキングウィンドウ上で動作しているとき

def project do 
    [app: :my_app, 
    version: "0.0.1", 
    elixir: "~> 1.3", 
    elixirc_paths: elixirc_paths(Mix.env), 
    compilers: [:phoenix, :gettext] ++ Mix.compilers, 
    build_embedded: Mix.env == :prod, 
    build_path: System.get_env("BUILD_PATH") || "_build", # Allows different path for builds 
    deps_path: System.get_env("DEPS_PATH") || "deps",  # Allows different path for deps 
    start_permanent: Mix.env == :prod, 
    aliases: aliases(), 
    deps: deps()] 
end 

をそれから私は、環境変数、例えばとして、これら2つの値を提供します

もちろん、この巨大なコマンドラインを覚えていないようにするカスタムシェルスクリプトがありますが、私はあなたのDocker作成設定に適応できると推測しています。最初にコンテナ内に作成されたフォルダがあることを確認するか、パスに2つの余分なボリュームをマウントすることを覚えておくだけです。

こちらがお役に立てば幸いです。

関連する問題