Docker не отвечает во время работы го сервера - PullRequest
0 голосов
/ 19 января 2019

Я не могу остановить веб-сервер Docker Golang в Docker-контейнере, отправив сигнал прерывания. У меня есть следующее main.go:

package main

import (
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {      
        w.Write([]byte("hello"))
    })
    log.Fatal(http.ListenAndServe(":1818", nil))
}

и Dockerfile:

FROM golang:1.11.4-alpine3.8
WORKDIR /go/src/server
COPY main.go main.go
CMD ["go", "run", "main.go"]

Я строю:

docker build -t goserver .

и запуск изображения:

docker run -p 1818:1818 goserver

В данный момент сервер работает. Когда я нажимаю Ctrl + C в моем консольном контейнере (и серверном процессе) все еще работает, и единственный способ остановить это - вызвать docker, чтобы сделать это. Я хотел бы знать, как обрабатывать такое поведение, чтобы сервер и контейнер останавливались при нажатии Ctrl + C.

Версия Docker 18.09.1 ​​

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Чтобы docker run передавал такие сигналы, как SIGINT, в контейнер, необходимо передать оба флага --interactive и --tty в docker run, которые обычно сокращаются до -it.

*.1007 * Без этих флагов сигнал не пересылается, как вы упомянули:
$ docker run -p 1818:1818 goserver
^C

При установленных флагах, однако, сигнал направляется в контейнер, и программа завершает работу, как если бы выполнялась непосредственно воболочка:

$ docker run -it -p 1818:1818 goserver
^Csignal: interrupt
$
0 голосов
/ 19 января 2019

Вы используете go run, поэтому отправляете сигнал инструменту go, а не процессу вашего сервера.Вы можете прервать сервер, запущенный с помощью go run в оболочке, поскольку ctrl+c в оболочке отправляет сигнал всей группе процессов.

Также нет причин компилировать исполняемый файл при каждом запуске контейнера(что может повлечь за собой гораздо больше накладных расходов при расширении вашей программы).Создание исполняемого файла при создании образа более эффективно и позволяет напрямую запускать сервер.

Пример файла Docker:

FROM golang:1.11.4-alpine3.8
WORKDIR /go/src/server
COPY main.go main.go
RUN go build
CMD ["./server"]

См. Аналогичный вопрос здесь, где процесс являетсяОболочка, а не инструмент go:

Отправка сигналов в приложение Golang в Docker

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