[英]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 有问题吗? 我怎样才能摆脱这个错误?
这是一个棘手的问题。 在阅读了其他类似的问题(以及来自 @potibas 和 @Stefano 的评论)后,我发现了发生了什么。
所以,正如我所说,发布文件在我的本地机器上运行良好。 发生这种情况是因为在我的本地机器中,文件被编译到其操作系统 (OS)。
现在,docker VM 与我的本地机器没有相同的操作系统。 这很重要,因为这一行:
COPY . /
在这里,我将所有内容从工作目录复制到 docker。 包括为我本地机器的 OS 编译的二进制文件和依赖项。
这导致了上述问题。
有 2 种可能的解决方案。
COPY
命令之后,通过RUN rm -r _build
和RUN rm -r deps/
从映像中删除_build
和deps
文件夹。.dockerignore
文件中。我个人选择了第二个选项,因为它可以让我拥有更精简的形象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.