我正在关注 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/