混合发行版的Docker因“执行格式错误”而崩溃

时间:2020-11-03 15:04:41

标签: docker elixir release mix

背景

我有一个通过mix release创建的可执行文件,当我在本地计算机上使用start运行该可执行文件时,效果很好。但是,尝试start可执行文件时,我的docker映像崩溃了,我不知道为什么。

Docker

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有问题吗? 我该如何摆脱这个错误?

1 个答案:

答案 0 :(得分:0)

RCA

这是一个棘手的问题。在阅读了其他类似的问题(以及@potibas和@Stefano的评论)之后,我发现了正在发生的事情。

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

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

COPY . /

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

这导致了上述问题。

解决方案

有2种可能的解决方案。

  1. _build命令之后,通过depsCOPY从图像中删除RUN rm -r _buildRUN rm -r deps/文件夹。
  2. 将提到的文件夹以及所有非必需文件添加到.dockerignore文件中。

我个人选择了第二个选项,因为它可以使我拥有更苗条的形象。

相关问题