首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在docker中如何正确运行golang应用程序?

在docker中如何正确运行golang应用程序?
EN

Stack Overflow用户
提问于 2019-03-11 13:43:32
回答 1查看 2.8K关注 0票数 3

我在Windows 10中开发了Golang应用程序,在我的本地机器上,它工作得很好。我删除了远程CentOS服务器的源代码,它有Docker。现在,我正试图在Docker中运行这个应用程序。

我在位于main.go文件所在的文件夹中创建了Dockerfile

代码语言:javascript
复制
- questionnaire
    - database
    - routes
    - utils
    - models
    - controllers
      main.go
      Dockerfile

Dockerfile如下所示:

代码语言:javascript
复制
FROM golang:1.12

RUN go get github.com/gorilla/mux && \
  go get github.com/gorilla/handlers && \
  go get github.com/lib/pq && \
  go get github.com/joho/godotenv && \
  go get github.com/jinzhu/gorm && \
  go get github.com/go-goracle/goracle

COPY / ./

EXPOSE 8000

CMD ["go", "run", "main.go"]

我的main.go文件看起来非常简单:

代码语言:javascript
复制
package main

import (
  "github.com/gorilla/handlers"
  "github.com/gorilla/mux"
  "github.com/joho/godotenv"
  "log"
  "net/http"
  "questionnaire/database"
  "questionnaire/routes"
  "questionnaire/utils"
)

func main()  {
  err := godotenv.Load(".env")
  if err != nil {
    panic(err)
  }

  database.ConnectOracle()
  defer database.DisconnectOracle()

  router := mux.NewRouter()

  headers := handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type", "Authorization"})
  methods := handlers.AllowedMethods([]string{"GET", "POST", "PATCH", "PUT", "DELETE", "OPTIONS"})
  origins := handlers.AllowedOrigins([]string{"*"})

  router.StrictSlash(true)

  routes.Handle(router)

  port := utils.CheckEnvironmentVariable("APPLICATION_PORT")

  log.Printf("RESTful web service is running on %s port.", port)

  log.Fatal(http.ListenAndServe(":" + port, handlers.CORS(headers, methods, origins)(router)))
}

我成功地创建了Docker映像,但是在创建Docker容器时出现了错误:

代码语言:javascript
复制
main.go:9:2: cannot find package "questionnaire/database" in any of:
        /usr/local/go/src/questionnaire/database (from $GOROOT)
        /go/src/questionnaire/database (from $GOPATH)
main.go:10:2: cannot find package "questionnaire/routes" in any of:
        /usr/local/go/src/questionnaire/routes (from $GOROOT)
        /go/src/questionnaire/routes (from $GOPATH)
main.go:11:2: cannot find package "questionnaire/utils" in any of:
        /usr/local/go/src/questionnaire/utils (from $GOROOT)
        /go/src/questionnaire/utils (from $GOPATH)

有人能说出如何解决这个问题吗?

我还试图通过下一个Dockerfile在Docker中构建golang应用程序的二进制文件,但是错误消息是相同的RUN go build命令:

代码语言:javascript
复制
FROM golang:1.12

RUN go get github.com/gorilla/mux && \
  go get github.com/gorilla/handlers && \
  go get github.com/lib/pq && \
  go get github.com/joho/godotenv && \
  go get github.com/jinzhu/gorm && \
  go get gopkg.in/goracle.v2

ADD . /go/src/questionnaire

WORKDIR /go/src/questionnaire

RUN go build -o /bin questionnaire

ENV PORT=8000

CMD ["/bin"]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-11 15:13:18

main.go文件中的导入指定:

"questionnaire/database" "questionnaire/routes" "questionnaire/utils"

这意味着go编译器正在$GOPATH/questionnaire$GOROOT/questionnaire中查找这些包。您必须确保这些文件被复制到您正在构建的码头图像中的正确位置。

golang:1.12图像中的默认golang:1.12/go。确保您的问卷包被正确地放置在码头映像中的/go/src目录中。

至于Dockerfile:为go应用程序构建/部署Docker映像的一个常见策略是使用构建器模式(参见下面的示例Dockerfile )。它的要点是创建一个多阶段Dockerfile,其中第一阶段构建go可执行文件,第二阶段运行它。这意味着您可以在第一阶段隔离所有的依赖项,并在最后得到一个非常小的整体映像。

它看起来可能是这样的:

代码语言:javascript
复制
FROM golang:1.11-alpine AS builder

########
# Prep
########

# add the source
COPY . /go/src/questionnaire
WORKDIR /go/src/questionnaire/

########
# Build Go Wrapper
########

# Install go dependencies
RUN go get github.com/gorilla/mux && \
  go get github.com/gorilla/handlers && \
  go get github.com/lib/pq && \
  go get github.com/joho/godotenv && \
  go get github.com/jinzhu/gorm && \
  go get github.com/go-goracle/goracle

#build the go app
RUN GOOS=linux GOARCH=amd64 go build -o ./questionnaire ./main.go

########
# Package into runtime image
########
FROM alpine

# copy the executable from the builder image
COPY --from=builder /go/src/questionnaire .

ENTRYPOINT ["/questionnaire"]

EXPOSE 8080

希望这能有所帮助!

(编辑以反映以下评论)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55103204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档