如何解决混合发行版的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种可能的解决方案。
- 在
_build
命令之后,通过deps
和COPY
从图像中删除RUN rm -r _build
和RUN rm -r deps/
文件夹。 - 将提到的文件夹以及所有非必需文件添加到
.dockerignore
文件中。
我个人选择了第二个选项,因为它可以使我拥有更苗条的形象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。