не может получить логи из контейнера Docker, используя golang Docker SDK - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу скомпилировать ненадежный код в Docker-контейнере, поэтому я хочу проверить exec команду

import (
"context"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
log "github.com/sirupsen/logrus"
"io"
"os"
)

func main() {
dockerClient, err := client.NewClientWithOpts(client.WithVersion("1.38"))
if err != nil{
    log.Error("error when create dockerClient ",err)
}

ctx := context.Background()

container, err := dockerClient.ContainerCreate(ctx,&container.Config{
    Image:"golang",
    OpenStdin:true,
    Tty:true,
    AttachStdin:true,
    Cmd:[]string{"bash"},
    AttachStdout:true,
    AttachStderr:true,


},nil,nil,"")

if err := dockerClient.ContainerStart(ctx,container.ID,types.ContainerStartOptions{});err != nil{
    log.Error("error when start container", err)
    return
}

idResponse, err :=dockerClient.ContainerExecCreate(ctx,container.ID,types.ExecConfig{
    Cmd:[]string{"echo","hello"},
    Tty:true,
    AttachStderr:true,
    AttachStdout:true,
    AttachStdin:true,
    Detach:true,
})

if err := dockerClient.ContainerExecStart(ctx,idResponse.ID,types.ExecStartCheck{

}); err != nil{
    log.Error("error when exec start ", err)
}

reader, err :=dockerClient.ContainerLogs(ctx,container.ID,types.ContainerLogsOptions{
    ShowStdout:true,
    ShowStderr:true,


})

if err != nil{
    log.Error("error when containerLogs",err)
}

go io.Copy(os.Stdout,reader)

<- make(chan struct{})

}

как вы видите, я создаю новый процесс exec, исполняю новый cmd с именем "echo hello", я хочу получить вывод из запущенного контейнера и показать его в моей консоли golang. но не работает, не могли бы вы помочь мне решить? Я пробую так много способов, но не получилось.

и я тоже пытаюсь удалить dockerClient.ContainerLogs блок, заменить на

conn, err :=dockerClient.ContainerAttach(ctx,container.ID,types.ContainerAttachOptions{
    Stdout:true,
    Stderr:true,
    Stdin:true,
    Stream:true,
    Logs:true,
})

go io.Copy(os.Stdout,conn.Reader)

, но по-прежнему не удается получить журналы из контейнера. Когда я запускаю приведенный выше код, моя консоль пуста, ожидаемый результат - "привет" в моей консоли.

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