Здесь есть две проблемы:
- Пакет
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...