docker - 使用 Dockerfile 时找不到二进制文件

标签 docker go

我正在关注 Go's Docker instructions .他们的榜样对我有用。我现在正在尝试修改它以运行 TCP 服务器:

go get github.com/Kelindar/tcp

添加一个 Dockerfile:

FROM golang

ADD . /go/src/github.com/Kelindar/tcp
RUN go install github.com/Kelindar/tcp

ENTRYPOINT /go/bin/tcp

EXPOSE 8080

然后我构建它:

docker build --no-cache -t tcp .

构建输出:

Sending build context to Docker daemon    322kB
Step 1/5 : FROM golang
 ---> 9fe4cdc1f173
Step 2/5 : ADD . /go/src/github.com/Kelindar/tcp
 ---> 10abce658324
Step 3/5 : RUN go install github.com/Kelindar/tcp
 ---> Running in 59dc47b30474
Removing intermediate container 59dc47b30474
 ---> 8fab53d2882c
Step 4/5 : ENTRYPOINT /go/bin/tcp
 ---> Running in 18d4b5befccb
Removing intermediate container 18d4b5befccb
 ---> 073fdb78a481
Step 5/5 : EXPOSE 8080
 ---> Running in 8ee2b7bc0cba
Removing intermediate container 8ee2b7bc0cba
 ---> 8bf9f82d4fef
Successfully built 8bf9f82d4fef
Successfully tagged tcp:latest

现在,我运行它:

docker run --name test --rm tcp

我得到一个错误:

/bin/sh: 1: /go/bin/tcp: not found

不太确定该去哪里。

最佳答案

这里有两个问题:

  • github.com/Kelindar/tcp 不包含 main 函数,因此它无法生成要执行的二进制文件。
  • 没有main包,每个go程序都需要一个带有main函数的main

无论您在此存储库中运行 go build 还是 go install,您都会看到什么都不会发生,因为您的包实际上是一个库。

现在,如果您添加一个带有 tcp_server.go 文件的 cmd/tcp_server 文件夹,如下所示:

package main

import (
    "fmt"
    "log"
    "net"

    "github.com/kelindar/tcp"
)

func main() {
    closingChan := make(chan bool)
    onAccept := func(c net.Conn) {
        // Do something here.
    }

    l, err := net.Listen("tcp", fmt.Sprintf(":%d", 4242))
    if err != nil {
        log.Fatalf("Unable to net.Listen: %v", err)
    }

    server := &tcp.Server{
        Closing:  closingChan,
        OnAccept: onAccept,
    }

    log.Println("Server ready...")
    if err := server.Serve(l); err != nil {
        log.Fatalf("Server crashed: %v", err)
    }

    log.Println("Server stopped")
}

并且您更新 Dockerfile 以使用使用您的 tcp 包的命令:

FROM golang

RUN go get github.com/Kelindar/tcp
RUN go build -o $GOPATH/bin/tcp_server $GOPATH/src/github.com/Kelindar/tcp/cmd/tcp_server/tcp_server.go

ENTRYPOINT tcp_server

EXPOSE 8080

您的服务器将在 docker 中正常工作:

2019/06/16 05:23:29 Server ready...

关于docker - 使用 Dockerfile 时找不到二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615308/

相关文章:

docker - docker 如何处理多种挂载类型?

json - 将 JSON 解析为结构

oop - Go中扩展类型的访问方法

docker - 是否可以使用 Docker 远程 API 将图像复制到另一台主机?

docker - 在 localhost : Unable to init server: Broadway display type not supported: 上的 ubuntu docker 容器中运行 firefox

azure - 从 azr 注册表拉取时出现 ErrImagePull

mysql - 在 Go 中创建 MySql 接口(interface)的正确方法

python - Pillow ImageFont在Docker/Alpine和Ubuntu中有所不同

android - 如何在 Crashlytics 中获取 golang 的 Stack-trace

go - Go 中来自 GCF 的日志不包含日志级别