【发布时间】:2019-03-11 13:43:32
【问题描述】:
我在 Windows 10 中开发了 Golang 应用程序。在我的本地机器上它运行良好。我将源代码删除到具有 Docker 的远程 CentOS 服务器。现在我正在尝试在 Docker 中运行这个应用程序。
我在 main.go 文件所在的同一文件夹中创建了 Dockerfile。
- questionnaire
- database
- routes
- utils
- models
- controllers
main.go
Dockerfile
Dockerfile 看起来像这样:
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 Image 但创建 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"]
【问题讨论】:
-
不要使用相对导入。
-
@Flimzy 你好!为什么你认为这篇文章是重复的?这是不同的问题;(
-
这一行:
RUN go build -o /bin questionnaire对我来说似乎不是一个好主意,大多数(如果不是全部)Linux 在文件系统的根目录下都有一个名为bin的文件夹。该文件夹包含机器按预期运行可能需要的一堆二进制文件。通过用你的应用程序的二进制文件覆盖该文件夹,你会让自己头疼,我想......我还没有尝试过,所以我不能肯定......无论哪种方式我都建议你将你的二进制文件重命名为与现有文件/文件夹不冲突的东西或... -
...保留名称,但将其移动到尚未使用该名称的子文件夹中。