我对GoLang很陌生。我有一个非常简单的dockerFile,它正在尝试构建goLang Web服务。
FROM golang:alpine
WORKDIR /app/webservice_refArch
ADD . /app/webservice_refArch
RUN apk add git
RUN apk upgrade
RUN cd /app/webservice_refArch/ && go get webservice_refArch/restapi
RUN cd /app/webservice_refArch/cmd/reference-w-s-server && go build -o ../../server
ENTRYPOINT ./goapp
运行该版本时,找不到本地导入。
go get webservice_refArch/restapi
我得到的错误是:
软件包webservice_refArch / restapi:无法识别的导入路径 “ webservice_refArch / restapi”(导入路径开头不是 主机名)
当我在本地(同一文件夹中)运行相同命令时,它运行得很好。我确定我会丢失一些愚蠢的东西,但是对从docker运行时为何失败的任何想法都将不胜感激。
答案 0 :(得分:2)
缺少的是将您的项目放在$GOPATH
下,如果您有本地名称空间,它也应该在同一名称空间$GOPATH/domain.com/
下。
执行此操作的合适方法是进行多阶段构建。多阶段涉及的基本原理涉及调用一个临时容器,该容器可以简化应用程序的构建,然后将构建的资产从该空间复制到具有运行该应用程序所需的组件最少的容器映像中。
# builder
FROM golang:1-alpine AS builder
RUN apk add git ca-certificates --update
ENV SERVICE_NAME my_project
ENV NAMESPACE mydomain #if you don't use namespace space just ignore it and remove it from the following lines
ENV APP /src/${NAMESPACE}/${SERVICE_NAME}/
ENV WORKDIR ${GOPATH}${APP}
WORKDIR $WORKDIR
ADD . $WORKDIR
RUN go build
###############################################################
#image
FROM alpine
RUN apk add ca-certificates --update
ENV SERVICE_NAME webservice_refArch
ENV NAMESPACE my_domain #if you don't use namespace space just ignore it and remove it from the following lines
ENV APP /src/${NAMESPACE}/${SERVICE_NAME}/
ENV GOPATH /go
ENV WORKDIR ${GOPATH}${APP}
COPY --from=builder ${WORKDIR}${SERVICE_NAME} $WORKDIR
CMD ${WORKDIR}${SERVICE_NAME}
答案 1 :(得分:1)
这肯定不是很好,但是如果您第一次遇到困难,可以只复制可执行文件,例如:
FROM golang:alpine
RUN apk upgrade
COPY goapp .
CMD ./goapp
肯定最好在图像内部编译代码,但这不是必需的。因此,您可以在本地编译代码,然后仅移动可执行文件,这样就不会再有类似的问题了。
答案 2 :(得分:0)
那是因为我没有复制到我的GOROOT位置。结果,当它试图查找本地资源时,它不在GOROOT位置。
更改dockerFile看起来像这样...
func segmentControlledTableView() {
typeRx.asObservable()
.subscribe(onNext: { (type) in
switch type {
case RatesControllerType.location:
self.branchList.asObservable()
.bind(to: self.tableView.rx.items) {
(tableView: UITableView, index: Int, element:
BranchNearList) in
let indexPath = IndexPath(row: index, section:
0)
let cell =
tableView.dequeueReusableCell(withIdentifier:
"BranchesNearCell", for: indexPath) as!
BranchesNearCell
cell.loadCell(element)
return cell
}
.disposed(by: self.disposeBag)
break
case RatesControllerType.currency:
self.currencyList.asObservable()
.bind(to: self.tableView.rx.items) {
(tableView: UITableView, index: Int, element:
CurrencyNearList) in
let indexPath = IndexPath(row: index, section:
0)
let cell =
tableView.dequeueReusableCell(withIdentifier:
"CurrencyNearCell", for: indexPath) as!
CurrencyNearCell
cell.loadCell(element)
return cell
}
.disposed(by: self.disposeBag)
}
})
.disposed(by: self.disposeBag)
}