升级并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
相关产品推荐
相关产品推荐

