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

Docker容器中Deno集成postgresjs客户端频繁以代码139退出求助

Docker中Deno+postgresjs容器退出码139的解决方法

退出码139本质是段错误(SIGSEGV),结合你的Intel Mac环境和Alpine镜像特性,核心问题大概率是postgresjs的原生依赖与Alpine的musl libc不兼容,或是版本适配、启动时机的问题。以下是针对性的解决步骤:

1. 更换Deno镜像为Debian版本

Alpine镜像使用的musl libc对部分原生二进制库兼容性较差,换成Debian-based镜像可解决大部分这类问题,同时匹配课程指定的Deno版本:
修改api/Dockerfile的基础镜像:

FROM denoland/deno:debian-1.37.0

WORKDIR /app

COPY deps.js .
RUN deno cache deps.js

COPY . .
EXPOSE 8000

CMD [ "run", "--allow-net", "--allow-env", "--unstable", "app-run.js" ]

(注:去掉了--watch参数,容器环境下热重载易引发文件系统交互问题,先确保基础运行正常)

2. 手动指定postgresjs连接参数

避免依赖自动读取环境变量的潜在问题,显式传入连接参数:
修改api/app.js:

import { Hono } from "./deps.js";
import { postgres } from "./deps.js";

const app = new Hono();
const sql = postgres({
  host: Deno.env.get("PGHOST"),
  port: parseInt(Deno.env.get("PGPORT")),
  user: Deno.env.get("PGUSER"),
  password: Deno.env.get("PGPASSWORD"),
  database: Deno.env.get("PGDATABASE"),
});

app.get("/", async (c) => {
    const todos = await sql `SELECT * FROM todos`;
    return c.json(todos);
});

export default app;

3. 确保数据库就绪后再启动API

添加数据库健康检查,让API服务等待数据库完全初始化完成再启动:
修改docker-compose.yml:

services:
  api:
    build: api
    restart: unless-stopped
    volumes:
      - ./api:/app
    ports:
      - 8000:8000
    depends_on:
      database:
        condition: service_healthy
    env_file:
      - project.env

  database:
    container_name: postgresql_database
    image: postgres:16.1
    restart: unless-stopped
    env_file:
      - project.env
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U username -d database"]
      interval: 5s
      timeout: 5s
      retries: 5

4. 本地验证排除代码问题

在本地(非Docker环境)运行应用,确认代码本身无问题:

  1. 本地设置环境变量:
    export POSTGRES_USER=username
    export POSTGRES_PASSWORD=password
    export POSTGRES_DB=database
    export PGUSER=username
    export PGPASSWORD=password
    export PGDATABASE=database
    export PGHOST=localhost
    export PGPORT=5432
    
  2. 启动本地PostgreSQL(或临时把容器的5432端口映射到本地),然后运行:
    deno run --allow-net --allow-env --unstable api/app-run.js
    

访问localhost:8000,如果能正常返回数据,说明代码没问题,问题集中在Docker环境的兼容性上。

排查补充

  • 查看API容器的详细日志:docker logs <你的api容器名>,获取段错误的具体触发信息
  • 确认deps.js中的postgresjs地址正确,使用课程指定的postgresjs@v3.4.3版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:41:04