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

时间:2019-06-16 01:05:16

标签: 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

不太确定该怎么做。

1 个答案:

答案 0 :(得分:5)

这里有两个问题:

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

无论您是在此存储库中运行go build还是go install,您都不会看到任何事情,因为您的软件包实际上是一个库。

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

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...