如何用 main.go 文件夹内的本地包构建 docker 图像?
How to build docker image with local package inside folder with main.go?
我正在尝试 docker build -t test_1 。 ,但有这个错误:
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
我的docker文件(路径/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(路径:gowork/src/docker_test/main.go)
package main
import (
"docker_test/mult"
"fmt"
)
func main() {
fmt.Println("From different pkg")
mult.Multiple()
}
mult.go(路径: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)
}
go get
试图在 /go
路径中找到包 docker_test/mult
。但是,您已复制到 /go/src/app
。这就是为什么 go get
无法在本地找到包并假定包来自远程存储库,例如 github,并抛出错误 import path does not begin with hostname
。所以在 /go
路径中复制 docker_test/mult
。
另一个问题是,当您使用 WORKDIR go/src/app
时,它会在 /go
路径中创建 go/src/app
,因此最终路径变为 /go/go/src/app
。所以使用绝对路径,即 WORKDIR /go/src/app
.
试试这个 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"]
确保您设置了 GOPATH,在您的示例导入中使用 docker_test/mult,因此为了让编译器解析它,请将其放入 $GOPATH/docker_test/mult、
我已经调整了你的 Dockerfile,所以你应该可以构建它
Docker 文件
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"]
我正在尝试 docker build -t test_1 。 ,但有这个错误:
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
我的docker文件(路径/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(路径:gowork/src/docker_test/main.go)
package main
import (
"docker_test/mult"
"fmt"
)
func main() {
fmt.Println("From different pkg")
mult.Multiple()
}
mult.go(路径: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)
}
go get
试图在 /go
路径中找到包 docker_test/mult
。但是,您已复制到 /go/src/app
。这就是为什么 go get
无法在本地找到包并假定包来自远程存储库,例如 github,并抛出错误 import path does not begin with hostname
。所以在 /go
路径中复制 docker_test/mult
。
另一个问题是,当您使用 WORKDIR go/src/app
时,它会在 /go
路径中创建 go/src/app
,因此最终路径变为 /go/go/src/app
。所以使用绝对路径,即 WORKDIR /go/src/app
.
试试这个 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"]
确保您设置了 GOPATH,在您的示例导入中使用 docker_test/mult,因此为了让编译器解析它,请将其放入 $GOPATH/docker_test/mult、
我已经调整了你的 Dockerfile,所以你应该可以构建它
Docker 文件
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"]