Docker 的混合版本因 "Exec format error" 而崩溃
Docker of mix release crashes with "Exec format error"
背景
我有一个通过 mix release
创建的可执行文件,当我在本地计算机上 运行 使用 start
时它工作正常。但是,我的 docker 图像在尝试 start
可执行文件时崩溃了,我不知道为什么。
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
所以这个理论不成立了。
问题
我的 Docker 文件有问题吗?
我怎样才能摆脱这个错误?
美国广播公司
这是一个棘手的问题。在阅读了其他类似问题(以及@potibas 和@Stefano 的评论)后,我发现了发生了什么。
所以,正如我所说,发布文件在我的 local 机器上运行良好。发生这种情况是因为在我的 local 机器中,文件被编译到其操作系统 (OS)。
现在,docker VM 与我的本地机器不一样 OS。这很重要,因为这一行:
COPY . /
这里我将工作目录中的所有内容复制到docker。包括为我的本地计算机 OS.
编译的二进制文件和依赖项
这导致了上述问题。
解决方案
有 2 种可能的解决方案。
- 通过
RUN rm -r _build
和 RUN rm -r deps/
. 在 COPY
命令后从图像中删除 _build
和 deps
文件夹
- 将提到的文件夹以及所有 non-essential 文件添加到
.dockerignore
文件。
我个人选择了第二个选项,因为它让我的形象更苗条。
背景
我有一个通过 mix release
创建的可执行文件,当我在本地计算机上 运行 使用 start
时它工作正常。但是,我的 docker 图像在尝试 start
可执行文件时崩溃了,我不知道为什么。
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
所以这个理论不成立了。
问题
我的 Docker 文件有问题吗? 我怎样才能摆脱这个错误?
美国广播公司
这是一个棘手的问题。在阅读了其他类似问题(以及@potibas 和@Stefano 的评论)后,我发现了发生了什么。
所以,正如我所说,发布文件在我的 local 机器上运行良好。发生这种情况是因为在我的 local 机器中,文件被编译到其操作系统 (OS)。
现在,docker VM 与我的本地机器不一样 OS。这很重要,因为这一行:
COPY . /
这里我将工作目录中的所有内容复制到docker。包括为我的本地计算机 OS.
编译的二进制文件和依赖项这导致了上述问题。
解决方案
有 2 种可能的解决方案。
- 通过
RUN rm -r _build
和RUN rm -r deps/
. 在 - 将提到的文件夹以及所有 non-essential 文件添加到
.dockerignore
文件。
COPY
命令后从图像中删除 _build
和 deps
文件夹
我个人选择了第二个选项,因为它让我的形象更苗条。