如何使用main.go在文件夹内使用本地包构建docker镜像?

如何使用main.go在文件夹内使用本地包构建docker镜像?

问题描述:

I'm trying docker build -t test_1 . , but have this err:

package docker_test/mult: unrecognized import path "docker_test/mult" (import path does not begin with hostname)

The command '/bin/sh -c go get -d -v ./...' returned a non-zero code: 1

My dockerfile (path /gowork/src/Dockerfile):

FROM golang:1.9.1
COPY ./docker_test/mult /go/src/app

WORKDIR go/src/app
COPY ./docker_test/main.go .

RUN go get -d -v ./...
RUN go install -v ./...

CMD ["app"]
ENTRYPOINT ["app", "-f=7", "-s=9"]

main.go (path: gowork/src/docker_test/main.go)

package main

import (
    "docker_test/mult"
    "fmt"
)

func main() {
    fmt.Println("From different pkg")
    mult.Multiple()
}

mult.go (path: gowork/src/docker_test/mult/mult.go)

package mult

import (
    "flag"
    "fmt"
)

func Multiple() {

    first := flag.Int("f", 0, "placeholder")
    second := flag.Int("s", 0, "placeholder")

    flag.Parse()

    out := (*first) * (*second)
    fmt.Println(out)

}

我正在尝试docker build -t test_1。 ,但存在以下错误: p>

package docker_test / mult:无法识别的导入路径“ docker_test / mult” (导入路径不是以主机名开头) p>

命令'/ bin / sh -c go get -d -v。/ ...'返回了非零代码:1 p> blockquote>

我的dockerfile(路径/ gowork / src / Dockerfile): p>

  FROM golang:1.9.1 
COPY ./docker_test/mult / go / src / app 
  
WORKDIR go / src / app 
COPY ./docker_test/main.go。
 
RUN go get -d -v ./...
RUN go install -v ./...

CMD [“ app  “] 
ENTRYPOINT [” app“,” -f = 7“,” -s = 9“] 
  code>  pre> 
 
 

main.go(路径:gowork / src / docker_test / main.go) p>

 包main 
 
import(
“ docker_test / mult” 
“ fmt” 
)
 
func main(){  
 fmt.Println(“来自其他pkg”)
 mult.Multiple()
} 
  code>  pre> 
 
 

mult.go(路径:gowork / src / docker_test /mult/mult.go) p>

 程序包mult 
 
import(
“ flag” 
“ fmt” 
)
 
func Multiple(){\  n 
第一:= flag.Int(“ f”,0,“占位符”)
第二 := flag.Int(“ s”,0,“占位符”)
 
 flag.Parse()
 
 out:=(*第一)*(*第二)
 fmt.Println(out)\  n 
} 
  code>  pre> 
  div>

go get trying to find the package docker_test/mult into /go path. But, you have copied into /go/src/app. That's why go get can't find the package locally and assumes the package is from remote repository, eg, github, and throws error import path does not begin with hostname. So copy the docker_test/mult inside /go path.

Another concern is, when you use WORKDIR go/src/app, it creates go/src/app inside /go path, So finally the path becomes /go/go/src/app. So use absolute path ie, WORKDIR /go/src/app.

Try this dockerfile:

FROM golang:1.9.1
COPY ./docker_test/mult /go/src/docker_test/mult

WORKDIR /go/src/app
COPY ./docker_test/main.go .

RUN go get -d -v ./...
RUN go install -v ./...

CMD ["app"]
ENTRYPOINT ["app", "-f=7", "-s=9"]

Make sure you set the GOPATH, in your example import uses docker_test/mult, so in order compiler to resolve it place it into $GOPATH/docker_test/mult,

I have tweaked your Dockerfile, so you should be able to buld it

Dockerfile

FROM golang:1.9.1

ENV GOPATH /go

FROM golang:1.9.1
COPY ./docker_test /go/src/docker_test
COPY ./docker_test/main.go /go/src/app/main.go

WORKDIR /go/src/app

RUN go get -d -v ./...
RUN go install -v ./...


CMD ["app"]
ENTRYPOINT ["app", "-f=7", "-s=9"]