我正在使用Go和Gin框架创建一个Web应用程序.我们的 idea 是使用Docker能够在容器中运行它,并能够对其进行调试. 所以我的Dockerfile如下:

FROM golang:1.21.6

WORKDIR /go/src/gitlab.com/main/server

COPY go.mod .
COPY go.sum .

RUN go mod download

RUN go install github.com/cosmtrek/air@latest
RUN go install github.com/swaggo/swag/cmd/swag@latest
RUN go install github.com/go-delve/delve/cmd/dlv@latest

EXPOSE 2345
EXPOSE 80

我的 docker 布局是这样的:

version: "3.2"
services:
  service-influxdb:
    image: go-time-series
    build:
      context: ..
      dockerfile: docker/Dockerfile
    command: air -c .air.toml
    volumes:
      - ../:/go/src/gitlab.com/main/server
    ports:
      - 8080:80
      - 10000:2345
    environment:
      - WEB_APP_VERSION=0.0.1
      - WEP_APP_TITLE=Thori influx-DB
      - WEP_APP_DESCRIPTION=Micro service for the manage of the influx-db services
      - ENVIRONMENT=dev
      - HOST=localhost:8080
      - INFLUX_URL=http://localhost:8086
      - INFLUX_TOKEN=1234
      - INFLUX_ORG=Abc
      - INFLUX_MINIMUN_DATE=1677-09-21 00:12:44
      - INFLUX_MAXIMUN_DATE=2100-01-01 00:00:00

    network_mode: host

我的VS代码配置如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug in Docker",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "remotePath": "/go/src/gitlab.com/main/server",
            "port": 10000,
            "host": "127.0.0.1",
            "showLog": true,
            "trace": "log",
            "logOutput": "rpc"
        },
    ]
}

Docker-compose中提到的.air.toml文件如下:

root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"

[build]
  args_bin = []
  bin = "./tmp/main"
  full_bin = "dlv exec --accept-multiclient --headless --listen :2345 --api-version 2 ./tmp/main"
  pre_cmd = ["swag init -g ./cmd/main.go"]
  cmd = "go build -o ./tmp/main ./cmd/main.go"
  post_cmd = []
  delay = 0
  exclude_dir = ["assets", "tmp", "vendor", "testdata", "docs"]
  exclude_file = []
  exclude_regex = ["_test.go"]
  exclude_unchanged = true
  follow_symlink = true
  include_dir = []
  include_ext = ["go", "tpl", "tmpl", "html"]
  include_file = []
  kill_delay = "0s"
  log = "build-errors.log"
  poll = false
  poll_interval = 0
  rerun = false
  rerun_delay = 500
  send_interrupt = false
  stop_on_error = false

[color]
  app = ""
  build = "yellow"
  main = "magenta"
  runner = "green"
  watcher = "cyan"

[log]
  main_only = false
  time = true

[misc]
  clean_on_exit = true

[screen]
  clear_on_rebuild = true
  keep_scroll = true

最后,我的应用程序的主要内容如下:

func main() {
    port := flag.Int("port", 80, "Listening port")
    flag.Parse()

    if config.Cfg.Environment == "prod" {
        gin.ForceConsoleColor()
        gin.SetMode(gin.ReleaseMode)
    }

    router := gin.Default()
    loadSwagger(router)
    loadAPI(router)
    router.Run(fmt.Sprintf(":%d", *port))
}

func loadSwagger(router *gin.Engine) {
    //  @securityDefinitions.apikey ApiKeyAuth
    //  @in                         Header
    //  @name                       Authorization

    docs.SwaggerInfo.Title = config.Cfg.WebAppTitle
    docs.SwaggerInfo.Version = config.Cfg.WebAppVersion
    docs.SwaggerInfo.Description = config.Cfg.WebAppDescription
    docs.SwaggerInfo.Host = config.Cfg.Host

    router.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

我希望我的应用程序可以在本地的8080和10000端口上进行调试.然而,当我试图从端口8080访问它时,没有任何东西在运行,当我试图在VS CODE中开始调试时,我也得到了一个错误.

出现的日志(log)如下:

docker-service-influxdb-1  | [21:07:26] mkdir /go/src/gitlab.com/main/server/tmp
docker-service-influxdb-1  | [21:07:26] watching .
docker-service-influxdb-1  | [21:07:26] watching app
docker-service-influxdb-1  | [21:07:26] watching app/api
docker-service-influxdb-1  | [21:07:26] watching app/api/handlers
docker-service-influxdb-1  | [21:07:26] watching app/api/handlers/healthcheck
docker-service-influxdb-1  | [21:07:26] watching app/config
docker-service-influxdb-1  | [21:07:26] watching app/domain
docker-service-influxdb-1  | [21:07:26] watching app/domain/models
docker-service-influxdb-1  | [21:07:26] watching app/domain/ports
docker-service-influxdb-1  | [21:07:26] watching app/domain/services
docker-service-influxdb-1  | [21:07:26] watching app/repositories
docker-service-influxdb-1  | [21:07:26] watching cmd
docker-service-influxdb-1  | [21:07:26] watching docker
docker-service-influxdb-1  | [21:07:26] !exclude docs
docker-service-influxdb-1  | [21:07:26] !exclude tmp
docker-service-influxdb-1  | [21:07:26] > swag init -g ./cmd/main.go
docker-service-influxdb-1  | 2024/02/07 21:07:26 Generate swagger docs....
docker-service-influxdb-1  | 2024/02/07 21:07:26 Generate general API Info, search dir:./
docker-service-influxdb-1  | 2024/02/07 21:07:26 warning: failed to get package name in dir: ./, error: execute go list command, exit status 1, stdout:, stderr:no Go files in /go/src/gitlab.com/main/server
docker-service-influxdb-1  | 2024/02/07 21:07:26 Generating models.HealthCheck
docker-service-influxdb-1  | 2024/02/07 21:07:26 create docs.go at docs/docs.go
docker-service-influxdb-1  | 2024/02/07 21:07:26 create swagger.json at docs/swagger.json
docker-service-influxdb-1  | 2024/02/07 21:07:26 create swagger.yaml at docs/swagger.yaml
docker-service-influxdb-1  | [21:07:26] building...
docker-service-influxdb-1  | [21:07:27] running...
docker-service-influxdb-1  | API server listening at: [::]:2345
docker-service-influxdb-1  | 2024-02-07T21:07:27Z warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)

我觉得我犯了个愚蠢的错误,但我不知道我做错了什么.

推荐答案

删除network_mode: host行.

您的应用程序使用调试器的HTTP端口80和端口2345启动.您可以在控制台输出中看到这些端口之一,ports:的右侧也与这些端口号匹配.但是,主机联网通常会禁用所有Docker联网功能,包括重新映射端口的功能.您可能会在主机端口80和2345上访问应用程序,而不是重新映射的端口,但这不是您使用此设置的目的.

Go相关问答推荐

Golang Viper:如果第一个字段不存在,如何从另一个字段获取值

一种基于时间的Golang函数节制器

即使HTTP服务器正在使用GO和Protobuf、SQL Server启动,请求也不返回结果

Go中的net.SplitHostPort(r.RemoteAddr)安全性

在运行时更改 Go lang slog 的日志(log)级别

Golang Gorm Fiber - 如何将定义为别名的名称发送到索引模板?

未实现的 desc = 未知服务 pb.AuthService 我的简单身份验证服务器上出现错误

生成一个 CSV/Excel,在 Golang 中该列的下拉选项中指定值

如何将Golang测试用例的测试覆盖率值与特定阈值进行比较

Go Template if 条件

gopacket:IP-in-IP 数据包上的解码层

加密/椭圆:try 在无效点上进行操作

将文本文件放入切片然后进行比较

动态 SQL 集 Golang

go-libp2p - 从流中接收字节

为什么当我忽略 template.New() 程序可以成功运行?

Go模板中的浮点除法

gob 解码器仅返回数组中的第一个元素

为什么在 goroutine 中声明时,benbjohnson/clock 模拟计时器不执行?

处理程序中的无限循环