为了账号安全,请及时绑定邮箱和手机立即绑定

为多个 go.mod 项目编写 dockerfile

为多个 go.mod 项目编写 dockerfile

Go
PIPIONE 2022-07-11 15:59:07
有一个用 Go 编写的库。它的文件夹结构是:lib/    golang/        go.mod        lib.go        example/            golang/                proto/                    protofile                go.mod                main.go                Dockerfile示例是显示如何使用此库的文件夹,因此它有一个可以构建和运行的 main.go。为了使用 lib,example/golang/go.mod 是:module golanggo 1.15require (    lib/golang v0.0.0    other stuff...)replace lib/golang => ../../golang    现在我想把可运行的例子打包成一个 docker 镜像,Dockerfile 是:FROM golang:1.15WORKDIR /go/src/appCOPY . .RUN go env -w GO111MODULE=autoRUN go env -w GOPROXY=https://goproxy.io,directRUN go get -d -v ./...RUN go install -v ./...CMD ["app"]然后我 cd 进入 example/golang run docker build -t example .,错误日志是open /go/golang/go.mod: no such file or directory似乎无法访问 lib/go.mod 文件,然后我 cd 进入 lib 文件夹并运行docker build -t server -f examples/golang/Dockerfile .,但这会影响 main.go 的导入:import "golang/proto"错误日志是:golang/proto: unrecognized import path "golang/proto"我应该如何解决这个问题以制作 docker 图像?==========================================在我花了一些时间阅读 docker doc 之后,这里是关于这个问题的总结:docker build 命令遵循 PATH 参数,即.末尾的点。控制构建的内容,它决定了 docker build 可以访问哪些文件。所以第一个错误的原因是 pwd 是 lib/example/golang,而 docker build 命令路径是.,那么 docker build 无法访问 lib/example/golang 的父文件,它们在 main.go 中是必需的。命令应该是:docker build -t example ../../但是,docker build 只在内容路径的根目录中寻找 Dockerfile,所以使用 -f 告诉它 Dockerfile 的位置:docker build -t example -f ./Dockerfile ../../如果 pwd 是 lib/,则命令是docker build -t server -f examples/golang/Dockerfile .简短:如果 dockerfile 不在项目根路径下,请使用 docker build 命令的 -f 和 PATH 为其提供足够的文件访问权限。如果使用 go 模块,请确保 PATH 包含 go.mod 文件如果 main.go 位于子文件夹中,请确保 dockerfile 中的 WORKDIR 与 COPY 后的子文件夹相同,否则 go build 或 go install 编译失败
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

你Dockerfile的太嵌套了。由于您go build依赖于相对路径 - 父目录中的路径 - adocker build .不会看到任何父目录文件。


移动Dockerfile到顶部,例如


Dockerile

lib/

并更新以构建嵌套的构建目录:


FROM golang:1.15


WORKDIR /go/src/app


# just need to copy lib tree

COPY lib .  


# working from here now

WORKDIR /go/src/app/lib/golang/example/golang 


RUN go env -w GO111MODULE=auto    

RUN go env -w GOPROXY=https://goproxy.io,direct


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

RUN go install -v ./...


CMD ["app"]


查看完整回答
反对 回复 2022-07-11
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

您可以使用go mod vendor之前使用 Docker 进行构建,它会将您的所有 mod 集中在 vendor 文件夹中。


我在里面做了一个名为 build.sh 的新文件:


#! /bin/sh

go mod vendor

docker build . -t myapp/myservice

rm -rf ./vendor

并在我需要构建时运行它并通过删除供应商我仍然可以使用 go run *.go 与我的库的新版本


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信