mirror of https://github.com/docker/cli.git
refactor logs and support service logs /w tty
Refactor container logs system to make communicating log messages internally much simpler. Move responsibility for marshalling log messages into the REST server. Support TTY logs. Pave the way for fixing the ambiguous bytestream format. Pave the way for fixing details. Signed-off-by: Drew Erny <drew.erny@docker.com>
This commit is contained in:
parent
9a5513b791
commit
938bf846e3
|
@ -73,6 +73,7 @@ func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
||||||
Timestamps: opts.timestamps,
|
Timestamps: opts.timestamps,
|
||||||
Follow: opts.follow,
|
Follow: opts.follow,
|
||||||
Tail: opts.tail,
|
Tail: opts.tail,
|
||||||
|
Details: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
cli := dockerCli.Client()
|
cli := dockerCli.Client()
|
||||||
|
@ -80,6 +81,7 @@ func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
||||||
var (
|
var (
|
||||||
maxLength = 1
|
maxLength = 1
|
||||||
responseBody io.ReadCloser
|
responseBody io.ReadCloser
|
||||||
|
tty bool
|
||||||
)
|
)
|
||||||
|
|
||||||
service, _, err := cli.ServiceInspectWithRaw(ctx, opts.target)
|
service, _, err := cli.ServiceInspectWithRaw(ctx, opts.target)
|
||||||
|
@ -89,6 +91,14 @@ func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
task, _, err := cli.TaskInspectWithRaw(ctx, opts.target)
|
task, _, err := cli.TaskInspectWithRaw(ctx, opts.target)
|
||||||
|
tty = task.Spec.ContainerSpec.TTY
|
||||||
|
// TODO(dperny) hot fix until we get a nice details system squared away,
|
||||||
|
// ignores details (including task context) if we have a TTY log
|
||||||
|
if tty {
|
||||||
|
options.Details = false
|
||||||
|
}
|
||||||
|
|
||||||
|
responseBody, err = cli.TaskLogs(ctx, opts.target, options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if client.IsErrTaskNotFound(err) {
|
if client.IsErrTaskNotFound(err) {
|
||||||
// if the task ALSO isn't found, rewrite the error to be clear
|
// if the task ALSO isn't found, rewrite the error to be clear
|
||||||
|
@ -100,6 +110,13 @@ func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
||||||
maxLength = getMaxLength(task.Slot)
|
maxLength = getMaxLength(task.Slot)
|
||||||
responseBody, err = cli.TaskLogs(ctx, opts.target, options)
|
responseBody, err = cli.TaskLogs(ctx, opts.target, options)
|
||||||
} else {
|
} else {
|
||||||
|
tty = service.Spec.TaskTemplate.ContainerSpec.TTY
|
||||||
|
// TODO(dperny) hot fix until we get a nice details system squared away,
|
||||||
|
// ignores details (including task context) if we have a TTY log
|
||||||
|
if tty {
|
||||||
|
options.Details = false
|
||||||
|
}
|
||||||
|
|
||||||
responseBody, err = cli.ServiceLogs(ctx, opts.target, options)
|
responseBody, err = cli.ServiceLogs(ctx, opts.target, options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -112,6 +129,11 @@ func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
||||||
}
|
}
|
||||||
defer responseBody.Close()
|
defer responseBody.Close()
|
||||||
|
|
||||||
|
if tty {
|
||||||
|
_, err = io.Copy(dockerCli.Out(), responseBody)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
taskFormatter := newTaskFormatter(cli, opts, maxLength)
|
taskFormatter := newTaskFormatter(cli, opts, maxLength)
|
||||||
|
|
||||||
stdout := &logWriter{ctx: ctx, opts: opts, f: taskFormatter, w: dockerCli.Out()}
|
stdout := &logWriter{ctx: ctx, opts: opts, f: taskFormatter, w: dockerCli.Out()}
|
||||||
|
|
Loading…
Reference in New Issue