go-docker клиент получает логи контейнера каждые секунды ничего не возвращает - PullRequest
0 голосов
/ 22 мая 2018

Я использую пакет docker.io/go-docker для запуска контейнера с GO.Я могу получить все журналы контейнера, когда его основной метод возвращает

if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil {
    panic(err)
}

statusCh, errCh = cli.ContainerWait(context.Background(), resp.ID, container.WaitConditionNotRunning)

select {
    case err := <-errCh:
        if err != nil {
            panic(err)
        }
    case <-statusCh:
}

out, err := cli.ContainerLogs(context.Background(), resp.ID, types.ContainerLogsOptions{ShowStdout: true, ShowStderr: true})
if err != nil {
    panic(err)
}
// Do something with the logs here...

Хитрость в том, что выполнение основного метода занимает некоторое время, и я хочу показывать журналы контейнера пользователю каждую секунду.,Моя идея состояла в том, чтобы запустить новый цикл для цикла и сделать запрос на cli.ContainerLogs.

Поэтому я изменил свою реализацию на это:

nowUTC := strconv.FormatInt(time.Now().UTC().UnixNano(), 10)

if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil {
    panic(err)
}

statusCh, errCh = cli.ContainerWait(context.Background(), resp.ID, container.WaitConditionNotRunning)

exitCh := make(chan bool)

go func(since string, exit chan bool) {

Loop:

    for {
        select {
        case <-exit:
            break Loop
        default:

            sinceReq := since
            time.Sleep(time.Second)
            since = strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
            out, err := cli.ContainerLogs(context.Background(), resp.ID, types.ContainerLogsOptions{Since: sinceReq, ShowStdout: true, ShowStderr: true})
            if err != nil {
                panic(err)
            }

            b, err := ioutil.ReadAll(out)
            if err != nil {
                panic(err)
            }
            log.Printf("Rolling log Contener \n%s", string(b))
            // Do something with the logs here...
        }
    }
}(nowUTC, exitCh)


select {
case err := <-errCh:
    exitCh <- true
    if err != nil {
        panic(err)
    }
case <-statusCh:
    exitCh <- true
}

Все хорошо, за исключением того, что ioutil.ReadAll(out) ничего не возвращает.

Я пытался использовать несколько раз или форматов временикак, но без результатов:

  • nowUTC: = strconv.FormatInt (time.Now (). UTC (). UnixNano (), 10)
  • nowUTC: = strconv.FormatInt (time.Now (). UTC (). Unix (), 10)
  • nowUTC: = strconv.FormatInt (time.Now (). UnixNano (), 10)
  • nowUTC: = strconv.FormatInt (time.Now (). Unix (), 10)
  • nowUTC: = time.Now (). Формат (time.RFC3339)

Что такоеЯ отравляю?

1 Ответ

0 голосов
/ 19 июня 2018

Наконец-то я заработал, используя nowUTC :=time.Now().UTC(), но проблема была не только в используемом формате времени.

Хитрость в том, что я использовал " Docker Machine " наноутбук, и я закрывал свой ноутбук каждую ночь.Всякий раз, когда ноутбук засыпает, внутренние часы Docker Machine замирают.

Когда ноутбук выходит из спящего режима, это приводит к смещению времени между часами ноутбука и часами Docker Machine, и моя Docker Machine опаздывает на x часов.

Мой код Go запускается в приложении CLI на моем ноутбуке, и критерии времени запроса на извлечение журналов никогда не соответствуют содержимому журнала.

Все работает нормально после docker-machine restart

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