我正在关注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
不太确定该怎么做。
答案 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...