{"record":{"id":"6291512512db094b","repo":"docker/cli","slug":"invalid-logging-opts-for-driver-s","errorCode":null,"errorMessage":"invalid logging opts for driver %s","messagePattern":"invalid logging opts for driver (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/command/container/opts.go","lineNumber":923,"sourceCode":"\t\t\tfor param := range strings.SplitSeq(publish, \",\") {\n\t\t\t\tk, v, ok := strings.Cut(param, \"=\")\n\t\t\t\tif !ok || k == \"\" {\n\t\t\t\t\treturn optsList, fmt.Errorf(\"invalid publish opts format (should be name=value but got '%s')\", param)\n\t\t\t\t}\n\t\t\t\tparams[k] = v\n\t\t\t}\n\t\t\toptsList = append(optsList, fmt.Sprintf(\"%s:%s/%s\", params[\"published\"], params[\"target\"], params[\"protocol\"]))\n\t\t} else {\n\t\t\toptsList = append(optsList, publish)\n\t\t}\n\t}\n\treturn optsList, nil\n}\n\nfunc parseLoggingOpts(loggingDriver string, loggingOpts []string) (map[string]string, error) {\n\tloggingOptsMap := opts.ConvertKVStringsToMap(loggingOpts)\n\tif loggingDriver == \"none\" && len(loggingOpts) > 0 {\n\t\treturn map[string]string{}, fmt.Errorf(\"invalid logging opts for driver %s\", loggingDriver)\n\t}\n\treturn loggingOptsMap, nil\n}\n\n// takes a local seccomp daemon, reads the file contents for sending to the daemon\nfunc parseSecurityOpts(securityOpts []string) ([]string, error) {\n\tfor key, opt := range securityOpts {\n\t\tk, v, ok := strings.Cut(opt, \"=\")\n\t\tif !ok && k != \"no-new-privileges\" {\n\t\t\tk, v, ok = strings.Cut(opt, \":\")\n\t\t}\n\t\tif (!ok || v == \"\") && k != \"no-new-privileges\" {\n\t\t\t// \"no-new-privileges\" is the only option that does not require a value.\n\t\t\treturn securityOpts, fmt.Errorf(\"invalid --security-opt: %q\", opt)\n\t\t}\n\t\tif k == \"seccomp\" {\n\t\t\tswitch v {\n\t\t\tcase seccompProfileDefault, seccompProfileUnconfined:","sourceCodeStart":905,"sourceCodeEnd":941,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/cli/command/container/opts.go#L905-L941","documentation":"Returned in opts.go:923 by parseLoggingOpts when --log-driver=none is combined with one or more --log-opt entries. The `none` driver discards all logs and accepts no options, so passing any log-opt is contradictory and rejected.","triggerScenarios":"`docker run --log-driver none --log-opt max-size=10m ...` (any --log-opt together with the none driver).","commonSituations":"A base config or compose file sets log-driver none but also inherits default log-opts, or a script appends log-opts unconditionally.","solutions":["Drop all --log-opt flags when using --log-driver none.","Or switch to a real logging driver (json-file, local, syslog, ...) that accepts options.","Audit compose files for log_opt under a none log_driver."],"exampleFix":"# before\ndocker run --log-driver none --log-opt max-size=10m alpine\n\n# after\ndocker run --log-driver none alpine","handlingStrategy":"validation","validationCode":"func validateLoggingOpts(driver string, opts []string) error {\n    if driver == \"none\" && len(opts) > 0 {\n        return fmt.Errorf(\"--log-driver none takes no --log-opt\")\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"// Deterministic: either drop opts or change driver; do not retry.\nif driver == \"none\" && len(logOpts) > 0 { logOpts = nil }","preventionTips":["Never combine --log-driver none with --log-opt.\nAudit compose files: log_driver: none must omit log_opt.\nClear inherited log-opts when switching to none."],"tags":["container","logging","flag-validation","create"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}