浏览代码

Fail docker logs on all logging drivers apart from 'json-file'

Signed-off-by: Alexander Morozov <lk4d4@docker.com>
Alexander Morozov 10 年之前
父节点
当前提交
bdf3a0295d

+ 4 - 0
api/client/commands.go

@@ -1929,6 +1929,10 @@ func (cli *DockerCli) CmdLogs(args ...string) error {
 		return err
 		return err
 	}
 	}
 
 
+	if env.GetSubEnv("HostConfig").GetSubEnv("LogConfig").Get("Type") != "json-file" {
+		return fmt.Errorf("\"logs\" command is supported only for \"json-file\" logging driver")
+	}
+
 	v := url.Values{}
 	v := url.Values{}
 	v.Set("stdout", "1")
 	v.Set("stdout", "1")
 	v.Set("stderr", "1")
 	v.Set("stderr", "1")

+ 9 - 0
daemon/container.go

@@ -1489,3 +1489,12 @@ func (container *Container) getNetworkedContainer() (*Container, error) {
 func (container *Container) Stats() (*execdriver.ResourceStats, error) {
 func (container *Container) Stats() (*execdriver.ResourceStats, error) {
 	return container.daemon.Stats(container)
 	return container.daemon.Stats(container)
 }
 }
+
+func (c *Container) LogDriverType() string {
+	c.Lock()
+	defer c.Unlock()
+	if c.hostConfig.LogConfig.Type == "" {
+		return c.daemon.defaultLogConfig.Type
+	}
+	return c.hostConfig.LogConfig.Type
+}

+ 3 - 0
daemon/logs.go

@@ -44,6 +44,9 @@ func (daemon *Daemon) ContainerLogs(job *engine.Job) engine.Status {
 	if err != nil {
 	if err != nil {
 		return job.Error(err)
 		return job.Error(err)
 	}
 	}
+	if container.LogDriverType() != "json-file" {
+		return job.Errorf("\"logs\" endpoint is supported only for \"json-file\" logging driver")
+	}
 	cLog, err := container.ReadLog("json")
 	cLog, err := container.ReadLog("json")
 	if err != nil && os.IsNotExist(err) {
 	if err != nil && os.IsNotExist(err) {
 		// Legacy logs
 		// Legacy logs

+ 5 - 0
docs/man/docker-create.1.md

@@ -26,6 +26,7 @@ docker-create - Create a new container
 [**--ipc**[=*IPC*]]
 [**--ipc**[=*IPC*]]
 [**--link**[=*[]*]]
 [**--link**[=*[]*]]
 [**--lxc-conf**[=*[]*]]
 [**--lxc-conf**[=*[]*]]
+[**--log-driver**[=*[]*]]
 [**-m**|**--memory**[=*MEMORY*]]
 [**-m**|**--memory**[=*MEMORY*]]
 [**--memory-swap**[=*MEMORY-SWAP*]]
 [**--memory-swap**[=*MEMORY-SWAP*]]
 [**--mac-address**[=*MAC-ADDRESS*]]
 [**--mac-address**[=*MAC-ADDRESS*]]
@@ -108,6 +109,10 @@ IMAGE [COMMAND] [ARG...]
 **--lxc-conf**=[]
 **--lxc-conf**=[]
    (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
    (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
 
 
+**--log-driver**="|*json-file*|*none*"
+  Logging driver for container. Default is defined by daemon `--log-driver` flag.
+  **Warning**: `docker logs` command works only for `json-file` logging driver.
+
 **-m**, **--memory**=""
 **-m**, **--memory**=""
    Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
    Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
 
 

+ 2 - 0
docs/man/docker-logs.1.md

@@ -22,6 +22,8 @@ The **docker logs --follow** command combines commands **docker logs** and
 **docker attach**. It will first return all logs from the beginning and
 **docker attach**. It will first return all logs from the beginning and
 then continue streaming new output from the container’s stdout and stderr.
 then continue streaming new output from the container’s stdout and stderr.
 
 
+**Warning**: This command works only for **json-file** logging driver.
+
 # OPTIONS
 # OPTIONS
 **--help**
 **--help**
   Print usage statement
   Print usage statement

+ 5 - 0
docs/man/docker-run.1.md

@@ -27,6 +27,7 @@ docker-run - Run a command in a new container
 [**--ipc**[=*IPC*]]
 [**--ipc**[=*IPC*]]
 [**--link**[=*[]*]]
 [**--link**[=*[]*]]
 [**--lxc-conf**[=*[]*]]
 [**--lxc-conf**[=*[]*]]
+[**--log-driver**[=*[]*]]
 [**-m**|**--memory**[=*MEMORY*]]
 [**-m**|**--memory**[=*MEMORY*]]
 [**--memory-swap**[=*MEMORY-SWAP]]
 [**--memory-swap**[=*MEMORY-SWAP]]
 [**--mac-address**[=*MAC-ADDRESS*]]
 [**--mac-address**[=*MAC-ADDRESS*]]
@@ -209,6 +210,10 @@ which interface and port to use.
 **--lxc-conf**=[]
 **--lxc-conf**=[]
    (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
    (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
 
 
+**--log-driver**="|*json-file*|*none*"
+  Logging driver for container. Default is defined by daemon `--log-driver` flag.
+  **Warning**: `docker logs` command works only for `json-file` logging driver.
+
 **-m**, **--memory**=""
 **-m**, **--memory**=""
    Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
    Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
 
 

+ 4 - 0
docs/man/docker.1.md

@@ -82,6 +82,10 @@ unix://[/path/to/socket] to use.
 **--label**="[]"
 **--label**="[]"
   Set key=value labels to the daemon (displayed in `docker info`)
   Set key=value labels to the daemon (displayed in `docker info`)
 
 
+**--log-driver**="*json-file*|*none*"
+  Container's logging driver. Default is `default`.
+  **Warning**: `docker logs` command works only for `json-file` logging driver.
+
 **--mtu**=VALUE
 **--mtu**=VALUE
   Set the containers network mtu. Default is `1500`.
   Set the containers network mtu. Default is `1500`.
 
 

+ 4 - 0
docs/sources/reference/api/docker_remote_api_v1.18.md

@@ -252,6 +252,7 @@ Json Parameters:
   -   **LogConfig** - Logging configuration to container, format
   -   **LogConfig** - Logging configuration to container, format
         `{ "Type": "<driver_name>", "Config": {"key1": "val1"}}
         `{ "Type": "<driver_name>", "Config": {"key1": "val1"}}
         Available types: `json-file`, `none`.
         Available types: `json-file`, `none`.
+        `json-file` logging driver.
 
 
 Query Parameters:
 Query Parameters:
 
 
@@ -441,6 +442,9 @@ Status Codes:
 
 
 Get stdout and stderr logs from the container ``id``
 Get stdout and stderr logs from the container ``id``
 
 
+> **Note**:
+> This endpoint works only for containers with `json-file` logging driver.
+
 **Example request**:
 **Example request**:
 
 
        GET /containers/4fa6e0f0c678/logs?stderr=1&stdout=1&timestamps=1&follow=1&tail=10 HTTP/1.1
        GET /containers/4fa6e0f0c678/logs?stderr=1&stdout=1&timestamps=1&follow=1&tail=10 HTTP/1.1

+ 3 - 0
docs/sources/reference/commandline/cli.md

@@ -1405,6 +1405,9 @@ For example:
       -t, --timestamps=false    Show timestamps
       -t, --timestamps=false    Show timestamps
       --tail="all"              Number of lines to show from the end of the logs
       --tail="all"              Number of lines to show from the end of the logs
 
 
+NOTE: this command is available only for containers with `json-file` logging
+driver.
+
 The `docker logs` command batch-retrieves logs present at the time of execution.
 The `docker logs` command batch-retrieves logs present at the time of execution.
 
 
 The `docker logs --follow` command will continue streaming the new output from
 The `docker logs --follow` command will continue streaming the new output from

+ 5 - 3
docs/sources/reference/run.md

@@ -565,13 +565,15 @@ familiar with using LXC directly.
 
 
 You can specify a different logging driver for the container than for the daemon.
 You can specify a different logging driver for the container than for the daemon.
 
 
-### Log driver: none
+### Logging driver: none
 
 
-Disables any logging for the container.
+Disables any logging for the container. `docker logs` won't be available with
+this driver.
 
 
 ### Log driver: json-file
 ### Log driver: json-file
 
 
-Default logging driver for Docker. Writes JSON messages to file.
+Default logging driver for Docker. Writes JSON messages to file. `docker logs`
+command is available only for this logging driver
 
 
 ## Overriding Dockerfile image defaults
 ## Overriding Dockerfile image defaults
 
 

+ 23 - 0
integration-cli/docker_cli_daemon_test.go

@@ -703,3 +703,26 @@ func TestDaemonLoggingDriverNoneOverride(t *testing.T) {
 	}
 	}
 	logDone("daemon - 'none' logging driver override in run")
 	logDone("daemon - 'none' logging driver override in run")
 }
 }
+
+func TestDaemonLoggingDriverNoneLogsError(t *testing.T) {
+	d := NewDaemon(t)
+
+	if err := d.StartWithBusybox("--log-driver=none"); err != nil {
+		t.Fatal(err)
+	}
+	defer d.Stop()
+
+	out, err := d.Cmd("run", "-d", "busybox", "echo", "testline")
+	if err != nil {
+		t.Fatal(out, err)
+	}
+	id := strings.TrimSpace(out)
+	out, err = d.Cmd("logs", id)
+	if err == nil {
+		t.Fatalf("Logs should fail with \"none\" driver")
+	}
+	if !strings.Contains(out, `\"logs\" command is supported only for \"json-file\" logging driver`) {
+		t.Fatalf("There should be error about non-json-file driver, got %s", out)
+	}
+	logDone("daemon - logs not available for non-json-file drivers")
+}