【问题标题】:package X unrecognized import path : import path does not begin with hostname包 X 无法识别的导入路径:导入路径不以主机名开头
【发布时间】:2018-04-12 07:56:02
【问题描述】:

在我的 Golang/gin 项目中,我有一个 dockerfile。这个 docker 文件是这样的

FROM golang:latest

RUN mkdir -p /go/src/myAppName
ADD . /go/src/myAppName
WORKDIR /go/src/myAppName

ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH

RUN go get -d -v ./...
RUN go install -v ./...
RUN go get github.com/pilu/fresh

EXPOSE 8080

CMD ["fresh"]

当我在 Dockerfile 所在项目的根目录中运行命令 docker build . --tag=myAppName:dev 时,它运行良好,直到它想使用 go get -d -v ./... 命令安装软件包。

我的项目本身有很多不同的包,所以当它尝试导入这些包时,它会告诉我以下信息:

package myAppName/app: unrecognised import path "myAppName/app" (import path does not begin with hostname).

我已阅读this 问题并及时在我的 Dockerfile 中设置了$GOPATH

我还阅读了this 的问题,并尝试以手动方式构建项目,而无需使用全新的方式以及他们根本不设置 GOPATH 而是通过WORKDIR 命令进行设置的方法。

最后我尝试使用go-wrapper 命令,但是当我尝试使用它们时这些命令似乎不可用,导致错误command not found: go-wrapper

不幸的是,这些都不起作用,这是我的问题。

非常感谢任何正确方向的帮助或指示。

【问题讨论】:

  • 问问自己:“go get ./... 是做什么的?然后问你为什么想要这个?然后删除它。go get不是关于“安装包” ,它是关于通过git clone从例如github下载外部包。
  • 我确实对此提出了质疑,但由于我在项目中嵌套了 github 包的导入,因此我需要运行整个项目以检查导入
  • 那么go get ./... 仍然是错误的。如果你在磁盘上的包导入了外部依赖项,那么你应该只下载(去获取)这些依赖项。但是在 docker build 期间这样做是个坏主意。供应商(提交到您的项目 SCR)或使用依赖工具,如 dep(或 vgo,如果感觉书呆子)。但不要尝试去获取:绝对没有办法去完成你需要的。
  • 我会研究如何出售它们,因为这似乎是一个不错的选择,谢谢。

标签: docker go


【解决方案1】:

经过实验,我找到了解决方案:

  1. 所有依赖项都使用dep 提供。这是一个非常简单且非常有用的工具 - 我建议您开始使用它。

  2. 所有包(以及我自己的项目)都以它们的全名定位 - $GOPATH/src/github.com/username/project/package/etc

  3. 那么你可以像这样使用简单的Dockerfile

    FROM golang:latest AS builder
    
    RUN go version
    
    COPY . "/go/src/github.com/user/project"
    WORKDIR "/go/src/github.com/user/project"
    
    RUN set -x && \
      apt-get update && \
      go get github.com/golang/dep/cmd/dep && \
      which dep && \
      date
    
    #RUN go get -v -t  .   # <- alternative way if you really don't want to use vendoring
    RUN set -x && \
      dep ensure -v  && \
      echo "vendor:" && \
      dep status
    
    RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build  -o /run-file
    
    CMD ["/run-file"]
    
    EXPOSE 8000
    

【讨论】:

  • 如果我的存储库是私有的,这是否也有效?如果是,我需要添加一些东西吗?
  • 我也知道 dep 不是使用您提供的 docker 文件的命令
  • @duck,如果授权建立良好,它适用于我的私人仓库。 (但是我使用的不是 Github.com,但在概念上是一样的)。抱歉,我忘记添加我添加 dep 的方式(我在单独的 Dockerfile 中添加,但也可以就地添加)。已更新
  • 我通过一个简单的RUN 命令安装了 dep。但是授权仍然是一个问题,因为 dep 一直在获取私人仓库。关于如何建立其授权的任何想法?
  • 您的代码在哪里?在什么 githostong? GitHub? GitLab?你自己的服务器? AFAIK dep 在后台使用git clone。所以你只需要从构建机器授权 git 访问。通过IP、令牌或其他方式
猜你喜欢
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2021-10-15
  • 2015-07-02
相关资源
最近更新 更多