由於您確認您的docker-compose.yml
已將docker容器中的應用程序文件夾掛載,因此我將詳細闡述我是如何解決在類似場景中遇到的一些編譯問題的。這並沒有解決你所問的具體錯誤,但它可以作爲找出更適合你的問題的答案的指導。
我在Mac OS/X上開發並使用docker基於debian的圖像來構建我的Phoenix Framework項目。我通過docker -v "$PWD":/app -w /app potz/elixir-build mix phoenix.server
(potz/elixir-build
只是一個自定義的圖像,我用一些預先安裝的東西)在容器中安裝應用程序文件夾。這提出了一個問題,因爲當Phoenix在容器內運行時,它會看到帶有預編譯工件的_build
目錄並嘗試使用該目錄,但當然這會拋出各種奇怪的編譯錯誤消息,因爲它們是在不同的平臺(OS /X)。此外,依賴關係保存在./deps
文件夾中,並且這些文件也在OS/X上預編譯。
我對該問題的解決方案是指示docker爲構建工件和依賴項使用不同的文件夾,在仍使用相同的應用程序源文件的情況下有效分離這兩個環境。
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
然後在泊塢窗運行時,我提供這兩個值的環境變量,例如:
# /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
爲了做到這一點,我需要允許
mix.exs
的
build_path
和
deps_path
設置由環境變量覆蓋
當然,我有一個自定義外殼腳本,以避免始終記住這個龐大的命令行,但我猜你可以適應你的Docker組合設置。你只需要確保你在容器中創建了那些文件夾,或者記住在這些路徑上掛載兩個額外的卷,無論什麼更有意義。
我希望這會有所幫助。
您提到您正在Docker中運行phoenix應用程序。你是否有機會使用通過Docker裝載在開發中使用的相同應用程序文件夾(如'docker -v「$ PWD」:/ app ...')?如果是這樣的話,Phoenix可能會使用'./ build'文件夾中的預構建工件,這些工件是在不同的平臺上編譯的。 – potz
@PiguiguarFaga我們使用的是Docker Compose,因此我們的'docker-compose.yml'確實使用了相同的應用程序文件夾。有可能你是對的,最終用戶在主機上進行普通編譯,然後嘗試通過Docker進行使用。 –