docker/cli · error
invalid logging opts for driver
Error message
invalid logging opts for driver %s
What it means
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.
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.
Example fix
# before docker run --log-driver none --log-opt max-size=10m alpine # after docker run --log-driver none alpine
Defensive patterns
Strategy: validation
Validate before calling
func validateLoggingOpts(driver string, opts []string) error {
if driver == "none" && len(opts) > 0 {
return fmt.Errorf("--log-driver none takes no --log-opt")
}
return nil
} Try / catch
// Deterministic: either drop opts or change driver; do not retry.
if driver == "none" && len(logOpts) > 0 { logOpts = nil } Prevention
- Never combine --log-driver none with --log-opt. Audit compose files: log_driver: none must omit log_opt. Clear inherited log-opts when switching to none.
When it happens
Trigger: `docker run --log-driver none --log-opt max-size=10m ...` (any --log-opt together with the none driver).
Common situations: A base config or compose file sets log-driver none but also inherits default log-opts, or a script appends log-opts unconditionally.
Related errors
- invalid pull option: ' ': must be one of , or
- is not a valid mac address
- invalid value: . Valid memory swappiness range is 0-100
- invalid range format for --expose
- --env-file
AI-assisted analysis of docker/cli@4f84911bfe (2026-08-07).
Data as JSON: /api/errors/6291512512db094b.
Report an issue: GitHub.
Appendix: source
Thrown at cli/command/container/opts.go:923
for param := range strings.SplitSeq(publish, ",") {
k, v, ok := strings.Cut(param, "=")
if !ok || k == "" {
return optsList, fmt.Errorf("invalid publish opts format (should be name=value but got '%s')", param)
}
params[k] = v
}
optsList = append(optsList, fmt.Sprintf("%s:%s/%s", params["published"], params["target"], params["protocol"]))
} else {
optsList = append(optsList, publish)
}
}
return optsList, nil
}
func parseLoggingOpts(loggingDriver string, loggingOpts []string) (map[string]string, error) {
loggingOptsMap := opts.ConvertKVStringsToMap(loggingOpts)
if loggingDriver == "none" && len(loggingOpts) > 0 {
return map[string]string{}, fmt.Errorf("invalid logging opts for driver %s", loggingDriver)
}
return loggingOptsMap, nil
}
// takes a local seccomp daemon, reads the file contents for sending to the daemon
func parseSecurityOpts(securityOpts []string) ([]string, error) {
for key, opt := range securityOpts {
k, v, ok := strings.Cut(opt, "=")
if !ok && k != "no-new-privileges" {
k, v, ok = strings.Cut(opt, ":")
}
if (!ok || v == "") && k != "no-new-privileges" {
// "no-new-privileges" is the only option that does not require a value.
return securityOpts, fmt.Errorf("invalid --security-opt: %q", opt)
}
if k == "seccomp" {
switch v {
case seccompProfileDefault, seccompProfileUnconfined:View on GitHub (pinned to 4f84911bfe)