Вызывает остановку контейнера docker - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть контейнер docker, который запускает программу go по следующим строкам

package main
import (
    "fmt"
    "time"
)

func main() {

for {
        time.Sleep(2 * time.Second)
        fmt.Printf("woke up!\n")

    }

}

Документация docker гласит, что когда мы делаем docker stop <container id> docker позволит контейнеру аккуратно завершить работу в течение 10 секунд, а затем попытаться силой убить его, отправив другой сигнал. Поскольку мой код имеет бесконечное значение l oop, мне не ясно, когда я запускаю эту программу в своем собственном образе docker, как и почему мой контейнер мгновенно закрывается.

Кроме того, как только я знаю, почему он выключается, как я могу настроить свою программу go, чтобы она не выключалась, и позволить docker принудительно завершить работу.

Я основываюсь на своем понимании docker stop из docker документации

И в ней есть текст, который гласит: The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL.

Если быть точным, есть ли способ, которым я могу

  • Настройте мой код, где SIGTERM игнорируется, и docker демон должен в конечном итоге выполнить SIGKILL для контейнера

  • Настройте мой код, где я могу заставить SIGKILL также не вызывать останов контейнера (я понимаю, что в linux процесс не может перехватить или игнорировать SIGKILL). Но можно ли игнорировать SIGKILL, чтобы мой код обманул демона docker и контейнер не закрылся?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Это на самом деле не вопрос Docker, а в том, как Go обрабатывает такие сигналы, как SIGTERM.

https://gobyexample.com/signals

По сути, использование signal.Notify позволит вам действовать на SIGTERM и делать именно то, что вы хотите, в том числе игнорировать его.

0 голосов
/ 06 февраля 2020

Как насчет этого? Он использует https://github.com/syossan27/tebata для обработки сигналов. Пример ниже позволит остановить CTRL + C, но будет "сопротивляться", будучи убитым SIGTERM или SIGKILL.

package main

import (
    "fmt"
    "github.com/syossan27/tebata"
    "os"
    "syscall"
    "time"
)

func resist() {
    fmt.Println("Don't shut me down man!")
}

func main() {

    // Allow to be stopped by hitting CTRL+C
    c := tebata.New(syscall.SIGINT)
    c.Reserve(os.Exit, 1)

    // Catch SIGTERM and SIGKILL and do nothing
    t := tebata.New(syscall.SIGTERM, syscall.SIGKILL)
    t.Reserve(resist)

    // Print a message every 2 seconds
    for {
        select {
        case <- time.After(2 * time.Second):
            fmt.Println("Nothing happened...")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...