使用模块进行构建,在 Alpine 图像下失败但在 Windows 下没问题

Go build, with module, fails under an Alpine image but is fine under Windows

我是运行连接ETCD的小测试。此测试导入 go.etcd.io/etcd/clientv3 ,借助 go modules 的魔力,拉取 github.com/coreos/go-systemd/journal.

我使用go module来管理依赖。

首先,我 运行 我在 windows 和 go version go1.13.1 windows/amd64 下进行测试,一切都很好,并且按预期工作。

在那之后,因为我的 etcd 客户端项目打算通过基于 alpine 的 Docker 镜像进行部署,所以我尝试使用 go 1.13 镜像 golang:1.13-alpine 来编译它

我用过:

docker run --rm -v "/${PWD}":/go/src/ -w //go/src/ golang:1.13-alpine go build -o etcd

我遇到了第一个已知问题,告诉我 git 没有安装在 golang:1.13-alpine

build github.com/nirekin/etcd: cannot load github.com/coreos/go-systemd/journal: git init --bare in /go/pkg/mod/cache/vcs/1f60ff15ab3093bffd86f4a985673d120db13dabca39c597aaa5016031c601a6: exec: "git": executable file not found in $PATH

然后我用下面的docker文件构建了一个新图像,以便在golang:1.13-alpine

中添加git

Docker文件:

FROM golang:1.13-alpine

RUN apk --update add git less openssh && \
    rm -rf /var/lib/apt/lists/* && \
    rm /var/cache/apk/*

使用我的新图像,我尝试再次编译

docker run --rm -v "/${PWD}":/go/src/ -w //go/src/ my/image go build -o etcd

我得到了这个错误:

build github.com/myuser/etcd: cannot load github.com/coreos/go-systemd/journal: no matching versions for query "latest"

我不明白为什么同一个 1.13 版本在 windowsalpine 下的行为不同?

我做错了什么或遗漏了什么吗?

最终重现此强文本的文件:

转码:

package main

import (
    "log"
    "time"

    "go.etcd.io/etcd/clientv3"
)

func main() {
    c := clientv3.Config{
        Endpoints:   []string{"http://127.0.0.1:2379"},
        DialTimeout: 5 * time.Second,
    }
    log.Printf("%v", c)
}

go.mod:

module github.com/nirekin/etcd

go 1.13

require (
    github.com/coreos/etcd v3.3.17+incompatible // indirect
    github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
    github.com/gogo/protobuf v1.3.1 // indirect
    github.com/google/uuid v1.1.1 // indirect
    go.etcd.io/etcd v3.3.17+incompatible
    go.uber.org/zap v1.13.0 // indirect
    google.golang.org/grpc v1.25.1 // indirect
)

问题是 go.etcd.io/etcd 依赖于 linux 上的 github.com/coreos/go-systemd/journal,它没有正确使用 go 模块。有两个问题 (#321 and #325) 提交给项目,维护者确认了问题(但尚未解决)。

建议的解决方案是在 go.mod 中添加以下内容:

replace (
  github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 latest
)

然后是run go tidy。 (容器内)