微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

背景

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

解决方法

RCA

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

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

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

COPY . /

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

这导致了上述问题。

解决方案

有2种可能的解决方案。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。