我的Dockerfile
如下:
# syntax=docker/dockerfile:1
FROM golang:1.18-alpine
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN go build -o /datapuller
EXPOSE 8080
CMD [ "/datapuller" ]
我尝试使用$ docker build --tag datapuller .
进行构建
但出现错误:
main.go:13:2: no required module provides package gitlab.com/mycorp/mycompany/data/datapuller/dbutil; to add it:
go get gitlab.com/mycorp/mycompany/data/datapuller/dbutil
main.go:14:2: no required module provides package gitlab.com/mycorp/mycompany/data/datapuller/models; to add it:
go get gitlab.com/mycorp/mycompany/data/datapuller/models
如何解决这个问题,我可以直接用go run main.go
运行。
我的main.go
导入如下。我认为进口造成了这个问题:
package main
import (
"encoding/json"
client "github.com/bozd4g/go-http-client"
"github.com/robfig/cron/v3"
"github.com/xuri/excelize/v2"
"gitlab.com/mycorp/mycompany/data/datapuller/dbutil"
"gitlab.com/mycorp/mycompany/data/datapuller/models"
"gorm.io/gorm"
)
func main() {
...
因为在构建时需要提取关联的包。Docker可能缺少提取这些包所需的环境变量。建议您使用go mod vendor
命令,然后构建图像
FROM golang:1.18-alpine
ADD . /go/src/<project name>
WORKDIR /go/src/<project name>
RUN go build -mod=vendor -v -o /go/src/bin/main main.go
RUN rm -rf /go/src/<project name>
WORKDIR /go/src/bin
CMD ["/go/src/bin/main"]
当您将源代码复制到映像中时,您只复制当前目录中的文件
COPY *.go ./ # just the current directory's *.go, not any subdirectories
通常更常见的做法是在整个主机源树中进行复制,可能使用.dockerignore
文件导致某些源树被忽略
COPY ./ ./
否则,您需要将所需的特定子目录复制到映像中(每个目录都需要一个单独的COPY
命令(
COPY *.go ./
COPY dbutil/ dbutil/
COPY models/ models/