es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué obligar a Docker a eliminar todos los contenedores siempre da un estado de salida 125?

Estoy escribiendo este código ingenuo en Golang para solicitar a Docker que elimine todos los contenedores a la fuerza, pero cuando lo ejecuto, siempre me da error: salida de estado 125.

Estoy extremadamente confundido, ya que funciona sin problemas en mi propia interface de línea de comandos.

func removeAllContainers() error {
// container ls -a -q | xargs docker container rm
_, err := exec.Command(
“docker”,
“container”,
“ls”,
“-a”,
“-q”,
“|”,
“xargs”,
“docker”,
“container”,
“rm”,
“-f”,
).Output()
if err != nil {
return fmt.Errorf(“no se pueden eliminar todos los contenedores: %v”, err)
}
return nil
}

Este mensaje de error es muy poco informativo, solo sabemos que el demonio está teniendo algún problema, ¡pero no sabemos cuál es ese problema! Me pregunto si hay alguna manera de obtener un mensaje de error más detallado al ejecutar un comando de docker en Golang.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener mensajes de error más detallados al ejecutar un comando de docker en golang, podemos agregar la bandera -e o –error a el comando ‘docker container ls’. Esto hará que docker muestre errores encontrados durante la ejecución del comando, que será capturado en la salida de “exec.Command”.

    Además, podemos agregar la bandera -t o –tty para asignar un seudoterminal (TTY). Esto es necesario para obtener mensajes de error detallados al ejecutar comandos en un contenedor de docker no interactivo, que podría ser el problema en este caso.

    Aquí hay una versión actualizada de la función con estas modificaciones:

    func removeAllContainers() error {
        cmd := exec.Command("docker", "container", "ls", "-a", "-q")
        cmd.Stderr = os.Stderr // Redirigir stderr a os.Stderr
        out, err := cmd.Output()
        if err != nil {
            return fmt.Errorf("no se pueden listar todos los contenedores: %v", err)
        }
    
        args := []string{"docker", "container", "rm", "-f"}
        args = append(args, strings.Split(string(out), "\n")...)
        cmd = exec.Command("xargs", args...)
        cmd.Stderr = os.Stderr // Redirigir stderr a os.Stderr
        cmd.Stdout = os.Stdout // Redirigir stdout a os.Stdout
        cmd.Stdin = os.Stdin   // Redirigir stdin a os.Stdin
        cmd.SysProcAttr = &syscall.SysProcAttr{Setctty: true, Setsid: true} // Asignar seudoterminal (TTY)
        if err := cmd.Run(); err != nil {
            return fmt.Errorf("no se pueden eliminar todos los contenedores: %v", err)
        }
    
        return nil
    }
    

    Al redirigir os.Stderr a cmd.Stderr, aseguramos que cualquier error encontrado durante los comandos de docker se imprima en la terminal. Los campos Stdout y Stdin también se redirigen para el comando xargs, para asegurarse de que funcione como se espera.

    Finalmente, establecemos el campo SysProcAttr de cmd para asignar un seudoterminal (TTY), usando el paquete syscall.

    Con estas modificaciones, deberíamos poder obtener mensajes de error más detallados al ejecutar comandos de docker en golang.

Comments are closed.