You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级并Docker化Elixir/Phoenix应用后Kernel pid终止错误排查

Phoenix应用Docker容器化启动失败问题解决

问题背景

将Elixir/Phoenix应用从1.7.4升级至1.11.4并进行Docker容器化改造,本地通过iex -S mix phx.server可正常运行,生产环境release也能本地启动,但Docker镜像运行时出现Kernel pid终止错误,核心错误日志:

{"Kernel pid terminated",application_controller,"{application_start_failure,jujuba,{bad_return,{{'Elixir.jujuba.Application',start,[normal,[]]},{'EXIT',{undef,[{'Elixir.jujuba.Application',start,[normal,[]],[]},{application_master,start_it_old,4,[{file,\"application_master.erl\"},{line,293}]}]}}}}}"}

核心错误原因

undef错误表明Docker构建的release包中缺失应用核心代码:Dockerfile的build阶段仅复制了mix配置、config、rel目录,未复制应用的lib源码目录(以及umbrella项目下子应用的源码),导致启动时找不到Jujuba.Application.start/2函数。

此外还有两处次要问题:

  • Rust环境配置无效:RUN source "$HOME/.cargo/env"无法在独立的Docker RUN会话中生效,导致cargo路径未加入环境变量,可能影响native crate编译。
  • CMD启动命令错误:使用sh /bin/jujuba start路径错误,且未采用适合容器的前台启动模式,不利于日志收集。

修正后的Dockerfile

FROM hexpm/elixir:1.11.4-erlang-24.3.4.8-alpine-3.17.0 as build

RUN apk add --update git build-base curl

RUN mkdir jujuba
WORKDIR jujuba

ENV MIX_ENV prod
# 永久配置Rust环境变量
RUN curl https://sh.rustup.rs -sSf | sh -s -- --quiet -y && \
    echo 'source $HOME/.cargo/env' >> $HOME/.profile

RUN mix do local.hex --force, local.rebar --force

# 创建umbrella子应用目录(单应用可删除此段)
RUN mkdir -p ./apps/jujuba

# 复制mix配置文件
COPY mix.* ./
COPY ./apps/jujuba/mix.* ./apps/jujuba/

# 安装并编译依赖
RUN mix deps.get --only $MIX_ENV
RUN mix deps.compile

# 复制配置与源码(核心缺失步骤)
COPY config ./config
COPY lib ./lib
COPY ./apps/jujuba/lib ./apps/jujuba/lib
# 复制native crate目录(对应你编译的file_worker)
COPY native ./native

# 编译静态资源
RUN mix phx.digest

# 复制release配置并构建release
COPY rel ./rel
RUN PORT=4000 MIX_ENV=prod mix release jujuba

FROM alpine:3.17 AS app
# 补充运行时依赖libstdc++,用于native扩展
RUN apk add --update openssl postgresql-client libstdc++

WORKDIR /app
# 复制release到容器工作目录
COPY --from=build /jujuba/_build/prod/rel/jujuba/ .

# 采用foreground模式启动,适配容器日志收集
CMD ["./bin/jujuba", "foreground"]

额外检查项

  • 若为单应用项目,删除Dockerfile中所有apps/jujuba相关的目录创建与复制逻辑。
  • 确认rel/config.exs中正确配置了应用入口模块,确保release包含所有必要组件。
  • 本地测试release时,使用与Docker镜像一致的Elixir/Erlang版本,避免环境差异导致的隐性问题。

内容的提问来源于stack exchange,提问作者Pedro Neri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:42:22