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

无法访问通过Docker-Compose部署的Dotnet6 WebAPI

问题定位与解决方案

核心问题

你的Docker Compose配置里,mywebapi服务的entrypoint和command完全覆盖了Dockerfile中定义的WebAPI启动命令——容器启动后只在运行tail -f /dev/null,根本没启动你的Dotnet WebAPI程序,这就是为什么Postman访问会出现socket hang up错误(容器里根本没监听80端口)。

修复步骤

  1. 删除Compose中WebAPI服务的entrypoint和command配置
    把mywebapi服务里的这两段删掉:

    command:
      - -f
      - /dev/null
    entrypoint:
      - tail
    

    这样容器就会使用Dockerfile里的ENTRYPOINT ["dotnet", "SimpleAuthenticationModule.dll"]来启动WebAPI。

  2. 确保数据库连接字符串正确
    WebAPI连接Postgres时,不要用localhost,改用Compose服务名postgres作为数据库地址,因为在Docker网络里,容器可以通过服务名互相访问。比如连接字符串应该类似:

    Server=postgres;Port=5432;Database=你的库名;User Id=用户名;Password=密码;
    
  3. 处理数据库就绪问题(可选但推荐)
    depends_on只保证Postgres容器先启动,但不保证数据库服务已经就绪。可以在WebAPI启动逻辑里添加数据库连接重试机制,或者在Compose里用command执行等待脚本后再启动WebAPI,比如:

    mywebapi:
      # ... 其他配置
      command: ["./wait-for-it.sh", "postgres:5432", "--", "dotnet", "SimpleAuthenticationModule.dll"]
    

    (需要把wait-for-it.sh脚本放到容器里,或者用官方的等待工具)

修改后的Docker Compose示例片段

mywebapi:
  container_name: mywebapi
  environment:
    - ASPNETCORE_ENVIRONMENT=Development
    - ASPNETCORE_URLS=http://+:80
    - DOTNET_RUNNING_IN_CONTAINER=true
  ports:
    - "5080:80"
  depends_on:
    - postgres
  image: mywebapi:dev
  network_mode: bridge
  tty: true
  volumes:
      { omitted for brevity }
  working_dir: /app

验证方法

修改后重新启动容器:

docker-compose down && docker-compose up -d

然后查看WebAPI容器日志,确认程序正常启动:

docker logs mywebapi

如果日志里显示WebAPI已启动并监听80端口,再用Postman访问http://localhost:5080就应该正常了。

内容的提问来源于stack exchange,提问作者jason.kaisersmith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:04:44