[英]Docker of mix release crashes with "Exec format error"
我有一個通過mix release
創建的可執行文件,當我在本地機器上使用start
運行它時效果很好。 但是,我的 docker 映像在嘗試start
可執行文件時崩潰,我不知道為什么。
FROM elixir:1.10
# Install Hex + Rebar
RUN mix do local.hex --force, local.rebar --force
COPY . /
WORKDIR /
ENV MIX_ENV=prod
RUN mix do deps.get --only $MIX_ENV, deps.compile
RUN mix release
EXPOSE 8080
ENV PORT=8080
ENV SHELL=/bin/bash
CMD ["_build/prod/rel/my_app/bin/my_app", "start"]
這是我的 docker 文件。 除了編譯然后嘗試通過start
運行發布之外,它沒有什么特別的。
但是,當我使用docker run -p 8080:8080 my-app:1.0
執行 docker 鏡像時,docker 崩潰了:
/_build/prod/rel/my_app/releases/0.1.0/../../erts-10.5/bin/erl: 12: exec: /_build/prod/rel/my_app/erts-10.5/bin/erlexec: Exec format error
起初我認為這是因為文件_build/prod/rel/my_app/bin/my_app
在頂部丟失了#!/usr/bin/env bash
(在閱讀了一些 SO 問題之后)。
雖然它確實沒有那個,但它還有一些同樣有效的東西: #!/bin/sh
所以這個理論出來了。
我的 Dockerfile 有問題嗎? 我怎樣才能擺脫這個錯誤?
這是一個棘手的問題。 在閱讀了其他類似的問題(以及來自 @potibas 和 @Stefano 的評論)后,我發現了發生了什么。
所以,正如我所說,發布文件在我的本地機器上運行良好。 發生這種情況是因為在我的本地機器中,文件被編譯到其操作系統 (OS)。
現在,docker VM 與我的本地機器沒有相同的操作系統。 這很重要,因為這一行:
COPY . /
在這里,我將所有內容從工作目錄復制到 docker。 包括為我本地機器的 OS 編譯的二進制文件和依賴項。
這導致了上述問題。
有 2 種可能的解決方案。
COPY
命令之后,通過RUN rm -r _build
和RUN rm -r deps/
從映像中刪除_build
和deps
文件夾。.dockerignore
文件中。我個人選擇了第二個選項,因為它可以讓我擁有更精簡的形象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.