我有一个monorepo,拥有各种Go服务和图书馆.它的 struct 是

monorepo
 services 
  service-a 
   - Dockerfile
go.mod
go.sum

我的go.mod驻留在monorepo的根目录中,服务使用go.mod文件中声明的依赖项.

我使用以下工具构建Docker映像

Docker build-t ome:tag./services/service-a/

当我try 使用上面的docker命令从monorepo的根构建我的Docker映像时,我得到以下错误.

复制失败:生成上下文之外的禁止路径:/go mod()

下面是我的文档文件

FROM golang:1.14.1-alpine3.11

RUN apk add --no-cache ca-certificates git

# Enable Go Modules
ENV GO111MODULE=on

# Set the Current Working Directory inside the container
WORKDIR /app

# Copy go mod and sum files
COPY ../../go.mod go.sum ./

RUN go mod download

COPY . .

RUN CGO_ENABLED=0 go build -o service-a

ENTRYPOINT ["/app/service-a"]

我需要做些什么才能将不在当前目录下的文件添加到Docker映像中,而无需单独try .mod和go.monorepo内每项服务的金额?

推荐答案

Docker只允许从上下文向镜像添加文件,默认为Dockerfile所在的目录.您可以在构建时指定不同的上下文,但同样,它不允许您包含该上下文之外的文件:

docker build -f ./services/service-a/Dockerfile .

这应该使用当前目录作为上下文.

或者,您可以创建一个Temp目录,将所有工件复制到该目录并将其用作构建上下文.这可以由Makefile或构建脚本自动执行.

Go相关问答推荐

Go编译器标志-修剪路径不完全工作

使用一元或服务器流将切片从GRPC服务器返回到客户端

Go Colly-访问for循环中的URL

如何用Golang解码这个嵌套的json?

为什么没有正确生成这些元组?

Golang内置打印(Ln)函数&S行为怪异

无法使用Segentio;S Kafka-Go连接到融合的Kafka

确定果朗CSV行中的字节数

如何从 nil 指针创建值

如何将 goose 迁移与 pgx 一起使用?

这是实现超时的常见方法,为什么 time.After 不起作用

如何使用 sync.WaitGroup 来执行所有的 goroutine?

如何在 Golang http.Request 对象中读取自定义 ajaxParams

从Go中的随机日期开始以天为单位获取时间

emersion/go-imap - imap.FetchRFC822:无效内存地址或零指针取消引用

CBC Decrypter 解密加密文本,但部分文本被随机字符替换

Dockerfile 问题 - 为什么找不到二进制 dlv - 没有这样的文件或目录

如何在 golang revel 中获取动态应用程序配置

无限期运行 Go routine (完成后重新启动)

函数的递归调用以 goroutine 和惯用方式开始,以在所有工作 goroutine 完成时继续调用者