【发布时间】:2014-06-03 23:04:11
【问题描述】:
这是我的 Dockerfile。
FROM ubuntu
MAINTAINER me <my@email.com>
RUN apt-get update && apt-get install -y \
build-essential \
curl \
git \
make
# Get and compile go
RUN curl -s https://go.googlecode.com/files/go1.2.1.src.tar.gz | tar -v -C /usr/local -xz
RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1
ENV PATH /usr/local/go/bin:/go/bin:$PATH
ENV GOPATH /go
RUN go get github.com/gorilla/feeds
WORKDIR /go
CMD go version && go install feed && feed
它构建得很好:
sudo docker build -t ubuntu-go .
但是当我运行它时,我得到一个包错误:
sudo docker run -v /home/rbucker/go:/go --name go ubuntu-go
错误看起来像:
src/feed/feed.go:7:2:在以下任何一个中都找不到包“github.com/gorilla/feeds”: /usr/local/go/src/pkg/github.com/gorilla/feeds(来自 $GOROOT) /go/src/github.com/gorilla/feeds(来自 $GOPATH)
这很奇怪,因为“go install”没有安装依赖项,而之前的“go get github.com/gorilla/feeds”完成时没有错误。所以大概我有一个路径或环境问题,但所有的例子看起来都像这个。
PS:我的代码位于 /go/src/feed (feed.go)
package main
import (
"net/http"
"time"
"github.com/gorilla/feeds"
)
. . .
更新:当我手动执行“go get”然后启动“运行”时,它似乎工作。因此,“RUN go get”似乎将我的文件存储在以太而不是主机的卷中。
sudo docker run -v /home/rbucker/go:/go --name go ubuntu-go /bin/bash
然后
sudo docker run -v /home/rbucker/go:/go --name go ubuntu-go
(文件位于我的 ~/go/src/githum.com 和 ~/go/pkg 文件夹中。)
更新:在我看来,在 BUILD 步骤期间,/go 卷尚未附加到 docker 映像。所以它本质上被赋值为 nil。但是在运行期间,“get install”应该已经检索到了它的 deps。
最后:这可行,但显然不是首选方法:
CMD go get github.com/gorilla/feeds && go version && go install feed && feed
请注意,我在 CMD 中执行了“go get”而不是 RUN。
【问题讨论】:
-
go get自动递归依赖关系,因此您应该只在自己的包上运行go get,而不是显式获取大猩猩,它应该在正确的位置获取/安装所有依赖关系。如果您至少添加更多依赖项,这应该会简化事情。 -
我的包暂时是本地的,所以这不起作用。此外,“go install”也应该递归,但它没有。 “go get”被记录为安装软件包的适当方式。这也是防止 HEAD 错误从依赖项蔓延的首选方法。
-
我假设您已经完成了这项工作,但将其留给遇到此问题的其他人,现在有一个 base image for golang apps on Docker 似乎更简单
-
@Richard 请阅读Can I answer my own question?