2017-04-23 105 views
1

我有一個非常簡單的藥劑應用錯誤,在泊塢容器

defmodule Example do 
    require Logger 
    def greet(word) do 
    Logger.info "Hello #{word}" 
    end 
end 

Example.greet("hheheh") 

這就是所謂的mix run

我Dockerfile運行簡單的藥劑的應用程序看起來像這樣

FROM elixir 

COPY . /app/ 

WORKDIR /app 

RUN chmod a+rwx -R /app 

RUN mix deps get 

CMD ["mix", "run"] 

但是,當我啓動容器我得到以下錯誤:

Compiling 1 file (.ex) 
warning: redefining module Example (current version loaded from _build/dev/lib/example/ebin/Elixir.Example.beam) 
    lib/example.ex:1 


02:13:22.656 [info] Hello hheheh 
** (EXIT from #PID<0.73.0>) an exception was raised: 
    ** (File.Error) could not write to file "/app/_build/dev/lib/example/ebin/Elixir.Example.beam": read-only file system 
     (elixir) lib/file.ex:719: File.write!/3 
     (mix) lib/mix/compilers/elixir.ex:388: anonymous fn/4 in Mix.Compilers.Elixir.write_manifest/5 
     (elixir) lib/enum.ex:1755: Enum."-reduce/3-lists^foldl/2-0-"/3 
     (mix) lib/mix/compilers/elixir.ex:384: Mix.Compilers.Elixir.write_manifest/5 
     (mix) lib/mix/compilers/elixir.ex:163: anonymous fn/4 in Mix.Compilers.Elixir.compile_manifest/7 
     (elixir) lib/agent/server.ex:31: Agent.Server.handle_cast/2 
     (stdlib) gen_server.erl:601: :gen_server.try_dispatch/4 
     (stdlib) gen_server.erl:667: :gen_server.handle_msg/5 

02:13:22.704 [error] GenServer #PID<0.89.0> terminating 
** (File.Error) could not write to file "/app/_build/dev/lib/example/ebin/Elixir.Example.beam": read-only file system 
    (elixir) lib/file.ex:719: File.write!/3 
    (mix) lib/mix/compilers/elixir.ex:388: anonymous fn/4 in Mix.Compilers.Elixir.write_manifest/5 
    (elixir) lib/enum.ex:1755: Enum."-reduce/3-lists^foldl/2-0-"/3 
    (mix) lib/mix/compilers/elixir.ex:384: Mix.Compilers.Elixir.write_manifest/5 
    (mix) lib/mix/compilers/elixir.ex:163: anonymous fn/4 in Mix.Compilers.Elixir.compile_manifest/7 
    (elixir) lib/agent/server.ex:31: Agent.Server.handle_cast/2 
    (stdlib) gen_server.erl:601: :gen_server.try_dispatch/4 
    (stdlib) gen_server.erl:667: :gen_server.handle_msg/5 
Last message: {:"$gen_cast", {:cast, #Function<8.32884957/1 in Mix.Compilers.Elixir.compile_manifest/7>}} 
State: {[{:module, Example, :module, "lib/example.ex", nil, <<70, 79, 82, 49, 0, 0, 6, 200, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 149, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, ...>>}], [{:source, "lib/example.ex", [Logger, Kernel], [:erlang, String.Chars], [{Example, %{{:greet, 1} => '\b'}}, {Kernel, %{{:def, 2} => [3], {:defmodule, 2} => [1], {:to_string, 1} => [4]}}, {Logger, %{{:info, 1} => [4]}}], [{Logger, %{{:bare_log, 3} => [4]}}, {String.Chars, %{{:to_string, 1} => [4]}}, {:erlang, %{{:++, 2} => [4]}}], []}]} 

因此,該程序運行,但我不知道我真的明白了其餘的錯誤。

回答

0

有某種形式的文件模時間和權限問題回事:

Compiling 1 file (.ex) warning: redefining module Example (current version loaded from _build/dev/lib/example/ebin/Elixir.Example.beam)
lib/example.ex:1

這意味着mix run試圖加載它後,重新編譯代碼。

我的猜測是你的碼頭圖像是用MIX_ENV值創建的,它與mix run的默認值不同。 MIX_ENV有3個不同的值,prod,test,dev ...和不同的混合命令 使用不同的值來尋找預建BEAM文件的位置。

我會試着改變你的混音run命令:

RUN mix deps get

這應該是::

env MIX_ENV=prod mix run

+0

是'env MIX_ENV = prod mix run'它將在dockerfile中看起來如何? – metersk

0

,它說的問題可能是你的Dockerfile

RUN mix deps.get

(注意期間)

沒有那個,那麼「混合運行」將嘗試重建您的依賴關係。在你的容器中,你正在只讀文件系統上運行,所以你不能創建新的東西。