【发布时间】:2021-02-16 06:44:52
【问题描述】:
背景
我有一个通过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 有问题吗? 我怎样才能摆脱这个错误?
【问题讨论】:
-
可以
ENV SHELL=/bin/bash需要 bash 而不是#!/bin/sh吗? -
不确定是否是这种情况,但您是否已将
/_build/添加到 .dockerignore 文件中?我记得前段时间在混合来自开发机器 (mac) 和内部 docker (linux) 的构建文件时遇到问题。 -
这看起来像是用于创建映像的架构和用于运行容器的架构的问题。
标签: docker elixir release elixir-mix