【问题标题】:Docker of mix release crashes with "Exec format error"混合发布的 Docker 因“Exec 格式错误”而崩溃
【发布时间】:2021-02-16 06:44:52
【问题描述】:

背景

我有一个通过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 有问题吗? 我怎样才能摆脱这个错误?

【问题讨论】:

  • 可以 ENV SHELL=/bin/bash 需要 bash 而不是 #!/bin/sh 吗?
  • 不确定是否是这种情况,但您是否已将 /_build/ 添加到 .dockerignore 文件中?我记得前段时间在混合来自开发机器 (mac) 和内部 docker (linux) 的构建文件时遇到问题。
  • 这看起来像是用于创建映像的架构和用于运行容器的架构的问题。

标签: docker elixir release elixir-mix


【解决方案1】:

RCA

这是一个棘手的问题。在阅读了其他类似的问题(以及来自@potibas 和@Stefano 的cmets)后,我发现了发生了什么。

所以,正如我所说,发布文件在我的 本地 机器上运行良好。发生这种情况是因为在我的 local 机器中,文件被编译到其操作系统 (OS)。

现在,docker 虚拟机的操作系统与我的本地计算机不同。这很重要,因为这条线:

COPY . /

在这里,我将 一切 从工作目录复制到 docker。包括为我的本地机器操作系统编译的二进制文件和依赖项

这导致了上述问题。

解决方案

有两种可能的解决方案。

  1. COPY 命令之后,通过RUN rm -r _buildRUN rm -r deps/ 从图像中删除_builddeps 文件夹。
  2. 将上述文件夹以及所有非必要文件添加到.dockerignore 文件中。

我个人选择了第二个选项,因为它可以让我拥有更精简的形象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2022-12-30
    • 2017-09-28
    • 2017-08-21
    相关资源
    最近更新 更多