Перейти бинарный не найден при использовании Dockerfile - PullRequest
1 голос
/ 16 июня 2019

Я следую инструкциям Go Docker . Их пример работает на меня. Я сейчас пытаюсь изменить его для запуска tcp-сервера:

go get github.com/Kelindar/tcp

Добавить файл Docker:

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 Ответ

5 голосов
/ 16 июня 2019

Здесь есть две проблемы:

  • Пакет 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...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...