You need to enable JavaScript to run this app. Micronaut服务通过docker-compose部署无法连接PostgreSQL问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Micronaut服务通过docker-compose部署无法连接PostgreSQL问题求助

根因定位

你当前遇到的域名解析失败问题,核心原因是GraalVM原生镜像运行在scratch空基础镜像中,缺少DNS解析必需的系统配置文件。Docker容器内部的服务名解析依赖/etc/resolv.conf、/etc/nsswitch.conf等系统配置完成,而scratch镜像没有任何预置的系统文件,导致Java程序无法解析docker-compose定义的服务名st-database。

可行解决方案

方案1:替换轻量基础镜像(推荐)

将最终运行阶段的基础镜像从scratch换成alpine,镜像体积仅增加几MB,同时自带完整的系统基础配置,无需额外调整:

# 替换最后阶段的配置
FROM alpine:3.18
EXPOSE 7000
COPY --from=build /author-service/service /service
ENTRYPOINT ["./service"]

方案2:保留scratch镜像,补充必要配置文件

如果需要极致压缩镜像体积,可以在最终阶段从构建镜像拷贝DNS解析必需的配置文件:

FROM scratch
EXPOSE 7000
# 拷贝DNS解析配置
COPY --from=build /etc/resolv.conf /etc/resolv.conf
COPY --from=build /etc/nsswitch.conf /etc/nsswitch.conf
COPY --from=build /etc/hosts /etc/hosts
COPY --from=build /author-service/service /service
ENTRYPOINT ["./service"]

补充优化:解决启动顺序问题

修复解析问题后,你可能还会遇到数据库未完全启动就触发服务连接的报错,可以给docker-compose增加健康检查配置确保启动顺序正确:

services:
  st-database:
    image: postgres:13.3-alpine
    restart: always
    env_file:
      - database.env
    volumes:
      - database-data:/var/lib/postgresql/data/
    networks:
      - database-network
    # 新增健康检查
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U <你的数据库用户名> -d sentency_db"]
      interval: 5s
      timeout: 5s
      retries: 5

  st-author-service:
    image: author-service:latest
    environment:
      - JDBC_URL=jdbc:postgresql://st-database:5432/sentency_db
      - JDBC_USER=<USERNAME>
      - JDBC_PASSWORD=<PASSWORD>
      - JDBC_DRIVER=org.postgresql.Driver
    depends_on:
      st-database:
        # 等待数据库健康检查通过再启动
        condition: service_healthy
    networks:
      - database-network
      - internal

另外你原Dockerfile中的EXPOSE 7000:7000写法有误,EXPOSE仅需要声明端口号,改为EXPOSE 7000即可,端口映射是docker run或者docker-compose的ports配置项负责的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 04:18:03