我在Windows 10中开发了Golang应用程序,在我的本地机器上,它工作得很好。我删除了远程CentOS服务器的源代码,它有Docker。现在,我正试图在Docker中运行这个应用程序。
我在位于main.go文件所在的文件夹中创建了Dockerfile。
- questionnaire
- database
- routes
- utils
- models
- controllers
main.go
DockerfileDockerfile如下所示:
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文件看起来非常简单:
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容器时出现了错误:
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命令:
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"]发布于 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可执行文件,第二阶段运行它。这意味着您可以在第一阶段隔离所有的依赖项,并在最后得到一个非常小的整体映像。
它看起来可能是这样的:
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希望这能有所帮助!
(编辑以反映以下评论)
https://stackoverflow.com/questions/55103204
复制相似问题