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

