remove client-side for supported logging drivers
The `docker logs` command performed a client-side check if the container's logging driver was supported. Now that we allow the client to connect to both "older" and "newer" daemon versions, this check is best done daemon-side. This patch remove the check on the client side, and leaves validation to the daemon, which should be the source of truth. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
054e479bfa
commit
05dc9846e1
|
@ -1,7 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -13,11 +12,6 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var validDrivers = map[string]bool{
|
|
||||||
"json-file": true,
|
|
||||||
"journald": true,
|
|
||||||
}
|
|
||||||
|
|
||||||
type logsOptions struct {
|
type logsOptions struct {
|
||||||
follow bool
|
follow bool
|
||||||
since string
|
since string
|
||||||
|
@ -54,15 +48,6 @@ func NewLogsCommand(dockerCli *command.DockerCli) *cobra.Command {
|
||||||
func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
c, err := dockerCli.Client().ContainerInspect(ctx, opts.container)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !validDrivers[c.HostConfig.LogConfig.Type] {
|
|
||||||
return fmt.Errorf("\"logs\" command is supported only for \"json-file\" and \"journald\" logging drivers (got: %s)", c.HostConfig.LogConfig.Type)
|
|
||||||
}
|
|
||||||
|
|
||||||
options := types.ContainerLogsOptions{
|
options := types.ContainerLogsOptions{
|
||||||
ShowStdout: true,
|
ShowStdout: true,
|
||||||
ShowStderr: true,
|
ShowStderr: true,
|
||||||
|
@ -78,6 +63,11 @@ func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
||||||
}
|
}
|
||||||
defer responseBody.Close()
|
defer responseBody.Close()
|
||||||
|
|
||||||
|
c, err := dockerCli.Client().ContainerInspect(ctx, opts.container)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if c.Config.Tty {
|
if c.Config.Tty {
|
||||||
_, err = io.Copy(dockerCli.Out(), responseBody)
|
_, err = io.Copy(dockerCli.Out(), responseBody)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -18,7 +18,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrReadLogsNotSupported is returned when the logger does not support reading logs.
|
// ErrReadLogsNotSupported is returned when the logger does not support reading logs.
|
||||||
var ErrReadLogsNotSupported = errors.New("configured logging reader does not support reading")
|
var ErrReadLogsNotSupported = errors.New("configured logging driver does not support reading")
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// TimeFormat is the time format used for timestamps sent to log readers.
|
// TimeFormat is the time format used for timestamps sent to log readers.
|
||||||
|
|
|
@ -21,13 +21,16 @@ import (
|
||||||
// ContainerLogs hooks up a container's stdout and stderr streams
|
// ContainerLogs hooks up a container's stdout and stderr streams
|
||||||
// configured with the given struct.
|
// configured with the given struct.
|
||||||
func (daemon *Daemon) ContainerLogs(ctx context.Context, containerName string, config *backend.ContainerLogsConfig, started chan struct{}) error {
|
func (daemon *Daemon) ContainerLogs(ctx context.Context, containerName string, config *backend.ContainerLogsConfig, started chan struct{}) error {
|
||||||
|
if !(config.ShowStdout || config.ShowStderr) {
|
||||||
|
return fmt.Errorf("You must choose at least one stream")
|
||||||
|
}
|
||||||
container, err := daemon.GetContainer(containerName)
|
container, err := daemon.GetContainer(containerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !(config.ShowStdout || config.ShowStderr) {
|
if container.HostConfig.LogConfig.Type == "none" {
|
||||||
return fmt.Errorf("You must choose at least one stream")
|
return logger.ErrReadLogsNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
cLog, err := daemon.getLogger(container)
|
cLog, err := daemon.getLogger(container)
|
||||||
|
|
|
@ -1189,7 +1189,7 @@ func (s *DockerDaemonSuite) TestDaemonLoggingDriverNoneLogsError(c *check.C) {
|
||||||
|
|
||||||
out, err = s.d.Cmd("logs", "test")
|
out, err = s.d.Cmd("logs", "test")
|
||||||
c.Assert(err, check.NotNil, check.Commentf("Logs should fail with 'none' driver"))
|
c.Assert(err, check.NotNil, check.Commentf("Logs should fail with 'none' driver"))
|
||||||
expected := `"logs" command is supported only for "json-file" and "journald" logging drivers (got: none)`
|
expected := `configured logging driver does not support reading`
|
||||||
c.Assert(out, checker.Contains, expected)
|
c.Assert(out, checker.Contains, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -310,8 +310,8 @@ func (s *DockerSuite) TestLogsFollowGoroutinesNoOutput(c *check.C) {
|
||||||
func (s *DockerSuite) TestLogsCLIContainerNotFound(c *check.C) {
|
func (s *DockerSuite) TestLogsCLIContainerNotFound(c *check.C) {
|
||||||
name := "testlogsnocontainer"
|
name := "testlogsnocontainer"
|
||||||
out, _, _ := dockerCmdWithError("logs", name)
|
out, _, _ := dockerCmdWithError("logs", name)
|
||||||
message := fmt.Sprintf("Error: No such container: %s\n", name)
|
message := fmt.Sprintf("No such container: %s\n", name)
|
||||||
c.Assert(out, checker.Equals, message)
|
c.Assert(out, checker.Contains, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DockerSuite) TestLogsWithDetails(c *check.C) {
|
func (s *DockerSuite) TestLogsWithDetails(c *check.C) {
|
||||||
|
|
Loading…
Reference in New Issue