amir20/dozzle · error

failed to write to stdout

Error message

failed to write to stdout: %w

What it means

After generating the users.yml content into an in-memory buffer, `dozzle generate` writes it to stdout. If that write fails (broken pipe, closed stdout), the underlying error is wrapped with this message.

Solutions

  1. Pipe into a command that consumes the full output, or redirect to a file: `dozzle generate > users.yml`
  2. Check disk space / file descriptor validity when redirecting stdout
  3. Avoid piping into commands that close stdin early

Example fix

// before
dozzle generate | head -1
// after
dozzle generate > users.yml
Defensive patterns

Strategy: try-catch

Validate before calling

dozzle generate > users.yml || echo "generate failed" >&2

Try / catch

if ! out=$(dozzle generate); then
  echo "generate failed: $out" >&2
  exit 1
fi

Prevention

When it happens

Trigger: Running `dozzle generate` with stdout closed or redirected to a broken destination, e.g. `dozzle generate | head -0` or piping into a process that has already exited (EPIPE).

Common situations: Piping output into `head`/`grep` that exits early; redirecting stdout to a full disk or closed file descriptor in shell scripts.

Related errors


AI-assisted analysis of amir20/dozzle@d9463cbe21 (2026-09-07). Data as JSON: /api/errors/235257a8fe099851. Report an issue: GitHub.

Appendix: source

Thrown at internal/support/cli/generate_command.go:54

		if password, err = readPassword(); err != nil {
			return err
		}
	}
	if password == "" {
		return fmt.Errorf("password is required")
	}

	buffer := auth.GenerateUsers(auth.User{
		Username:        args.Generate.Username,
		Password:        password,
		Name:            args.Generate.Name,
		Email:           args.Generate.Email,
		Filter:          args.Generate.Filter,
		RolesConfigured: args.Generate.RolesConfigured,
	}, true)

	if _, err := os.Stdout.Write(buffer.Bytes()); err != nil {
		return fmt.Errorf("failed to write to stdout: %w", err)
	}

	return nil
}

// readPassword reads a password from stdin. Prompts are written to stderr so
// they don't pollute stdout (which is commonly redirected to users.yml). When
// stdin is a terminal the input is read without echo; otherwise a single line
// is read (supports piping, e.g. `echo secret | dozzle generate ...`).
func readPassword() (string, error) {
	fd := int(os.Stdin.Fd())
	if term.IsTerminal(fd) {
		fmt.Fprint(os.Stderr, "Password: ")
		bytePassword, err := term.ReadPassword(fd)
		fmt.Fprintln(os.Stderr)
		if err != nil {
			return "", fmt.Errorf("failed to read password: %w", err)
		}

View on GitHub (pinned to d9463cbe21)