簡體   English   中英

mix 發布的 Docker 因“Exec 格式錯誤”而崩潰

[英]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 有問題嗎? 我怎樣才能擺脫這個錯誤?

RCA

這是一個棘手的問題。 在閱讀了其他類似的問題(以及來自 @potibas 和 @Stefano 的評論)后,我發現了發生了什么。

所以,正如我所說,發布文件在我的本地機器上運行良好。 發生這種情況是因為在我的本地機器中,文件被編譯到其操作系統 (OS)。

現在,docker VM 與我的本地機器沒有相同的操作系統。 這很重要,因為這一行:

COPY . /

在這里,我將所有內容從工作目錄復制到 docker。 包括為我本地機器的 OS 編譯的二進制文件和依賴項。

這導致了上述問題。

解決方案

有 2 種可能的解決方案。

  1. COPY命令之后,通過RUN rm -r _buildRUN rm -r deps/從映像中刪除_builddeps文件夾。
  2. 將上述文件夾以及所有非必要文件添加到.dockerignore文件中。

我個人選擇了第二個選項,因為它可以讓我擁有更精簡的形象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM