使用模块进行构建,在Alpine映像下失败,但在Windows下很好

时间:2019-11-22 15:13:47

标签: go alpine

我正在运行一个小型测试以连接到ETCD。此测试导入go.etcd.io/etcd/clientv3 女巫,借助go模块的魔力,拉起github.com/coreos/go-systemd/journal

我使用 go模块管理依赖项。

首先,我使用go version go1.13.1 windows/amd64在Windows下运行了测试,一切都很好,并且按预期运行。

在那之后,由于打算将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

  

构建github.com/nirekin/etcd:无法加载   github.com/coreos/go-systemd/journal:git init --bare in   / go / pkg / mod / cache / vcs / 1f60ff15ab3093bffd86f4a985673d120db13dabca39c597aaa5016031c601a6:   exec:“ git”:在$ PATH中找不到可执行文件

然后我用以下docker文件构建了一个新映像,以便在git中添加golang:1.13-alpine

Dockerfile:

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

我得到了这个错误:

  

构建github.com/myuser/etcd:无法加载   github.com/coreos/go-systemd/journal:没有匹配的查询版本   “最新”

我不知道为什么在解决依赖项时,相同的1.13版本的行为在 windows alpine 下会有所不同吗?

我是在做错什么还是错过了什么?

最终复制此文字的文件

执行代码

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
)

1 个答案:

答案 0 :(得分:3)

问题是go.etcd.io/etcd取决于Linux上的github.com/coreos/go-systemd/journal,而Linux没有正确使用go模块。向项目提交了两个问题(#321#325),维护人员确认了该问题(但尚未解决)。

建议的解决方案是将以下内容添加到go.mod

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

,然后run go tidy。 (在容器内)