Я использую пакет 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)
Что такоеЯ отравляю?