无法访问通过Docker-Compose部署的Dotnet6 WebAPI
核心问题
你的Docker Compose配置里,mywebapi服务的entrypoint和command完全覆盖了Dockerfile中定义的WebAPI启动命令——容器启动后只在运行tail -f /dev/null,根本没启动你的Dotnet WebAPI程序,这就是为什么Postman访问会出现socket hang up错误(容器里根本没监听80端口)。
修复步骤
删除Compose中WebAPI服务的entrypoint和command配置
把mywebapi服务里的这两段删掉:command: - -f - /dev/null entrypoint: - tail这样容器就会使用Dockerfile里的
ENTRYPOINT ["dotnet", "SimpleAuthenticationModule.dll"]来启动WebAPI。确保数据库连接字符串正确
WebAPI连接Postgres时,不要用localhost,改用Compose服务名postgres作为数据库地址,因为在Docker网络里,容器可以通过服务名互相访问。比如连接字符串应该类似:Server=postgres;Port=5432;Database=你的库名;User Id=用户名;Password=密码;处理数据库就绪问题(可选但推荐)
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

