出错.mod:没有这样的文件或目录编译器docker撰写本地包



当我使用docker构建带有本地依赖的应用程序来创建docker映像时,我遇到了一个问题。

我Dockerfile:

FROM golang:alpine AS build 
ENV GOPATH=$GOPATH
#GOPROXY
ENV GOPROXY=http://proxy.golang.org
ENV GO111MODULE=on

WORKDIR $GOPATH/src/github.com/julianskyline/motorcars-core-business
COPY . . 

# Set OS as linux
RUN GOOS=linux go build -o $GOPATH/bin/github.com/julianskyline/motorcars-core-business main.go
FROM alpine
COPY --from=build $GOPATH/bin/github.com/julianskyline/motorcars-core-business $GOPATH/bin/github.com/julianskyline/motorcars-core-business
ENTRYPOINT [ "/go/bin/motorcars-core-business" ]
My go.mod
module github.com/julianskyline/motorcars-core-business
go 1.15
replace (
github.com/julianskyline/errors => /home/julianmarin/proyectos/go/src/github.com/julianskyline/errors
github.com/julianskyline/motorcars-db => /home/julianmarin/proyectos/go/src/github.com/julianskyline/motorcars-db
github.com/julianskyline/motorcars-models => /home/julianmarin/proyectos/go/src/github.com/julianskyline/motorcars-models)

项目在同一个文件夹中:

GOPATH美元/src/github.com/julianskyline/errors$ GOPATH/src/github.com/julianskyline/motorcars-core-business

输入图片描述

go build/run work fine.

sudo docker-compose build:

Step 6/9 : RUN GOOS=linux go build -o $GOPATH/bin/github.com/julianskyline/motorcars-core-business main.go
---> Running in 45227441dfdd
go: github.com/julianskyline/errors@v0.0.0-00010101000000-000000000000 (replaced by /home/julianmarin/proyectos/go/src/github.com/julianskyline/errors): reading /home/julianmarin/proyectos/go/src/github.com/julianskyline/errors/go.mod: open /home/julianmarin/proyectos/go/src/github.com/julianskyline/errors/go.mod: no such file or directory
The command '/bin/sh -c GOOS=linux go build -o $GOPATH/bin/github.com/julianskyline/motorcars-core-business main.go' returned a non-zero code: 1
ERROR: Service 'api' failed to build 

注意:文件/home/julianmarin/proyectos/go/src/github.com/julianskyline/errors/go.mod存在!

Dockerfile$GOPATH/src/github.com/julianskyline/motorcars-core-business中,这意味着其中的COPY . .只会将$GOPATH/src/github.com/julianskyline/motorcars-core-business复制到docker映像中。

go.mod包含replace指令,该指令引用不在$GOPATH/src/github.com/julianskyline/motorcars-core-business(例如$GOPATH/src/github.com/julianskyline/errors)下的文件夹;这将导致编译错误,因为这些文件夹不存在于docker映像中。

要解决这个问题,可以:

  • 将整个julianskyline文件夹复制到图像中(通过将Docker文件移动到父文件夹,在命令行上指定上下文或使用docker-compose)。
  • 删除replace指令,让go从github中提取文件。

根据评论的要求发布答案;我相信这些评论为op提供了足够的信息。

最新更新