Extracción de imágenes de Docker SinGged usando Python -- python camp codereview Relacionados El problema

Removing untagged docker images using Python


3
vote

problema

Español

He escrito un pedazo de código en Python para eliminar las imágenes de Docker que no se etiquetan solo:

  # docker images REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE release             3.1                 b6bf9d19cc6c        5 hours ago         869MB release             3.2                 b6bf9d19cc6c        5 hours ago         869MB <none>              <none>              3dfdfcb0769d        6 hours ago         433MB <none>              <none>              d505190470fd        6 hours ago         433MB <none>              <none>              979a42368814        7 hours ago         433MB <none>              <none>              f8bcf895ffce        7 hours ago         433MB <none>              <none>              8c1ed97822da        7 hours ago         433MB release             1.0                 36e9ea407082        7 hours ago         433MB ubuntu              16.04               6a2f32de169d        6 days ago          117MB vault               latest              144fecac962b        3 weeks ago         64.4MB   

Código PYTHON:

  import subprocess  output = subprocess.Popen(["docker", "images"], stdout=subprocess.PIPE)  result = output.communicate()[0].split(" ") image_list = []  for line in result[1:]:      if ("<none>" == line.split("  ")[0]):         image_list.append(filter(None,line.split("  "))[2])  for image in image_list:      #Piping both stdout and stderr to stdout.      output = subprocess.Popen(["docker", "rmi", "-f", image], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)      print(output.communicate()[0])   

Salida final:

Imágenes de Docker

  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE release             3.1                 b6bf9d19cc6c        5 hours ago         869MB release             3.2                 b6bf9d19cc6c        5 hours ago         869MB release             1.0                 36e9ea407082        7 hours ago         433MB ubuntu              16.04               6a2f32de169d        6 days ago          117MB vault               latest              144fecac962b        3 weeks ago         64.4MB   

Por favor, hágamelo saber si el código se puede optimizar o se puede escribir de una manera más Pythonic.

Original en ingles

I have written a piece of code in Python for removing the docker images which are not tagged only:

# docker images REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE release             3.1                 b6bf9d19cc6c        5 hours ago         869MB release             3.2                 b6bf9d19cc6c        5 hours ago         869MB <none>              <none>              3dfdfcb0769d        6 hours ago         433MB <none>              <none>              d505190470fd        6 hours ago         433MB <none>              <none>              979a42368814        7 hours ago         433MB <none>              <none>              f8bcf895ffce        7 hours ago         433MB <none>              <none>              8c1ed97822da        7 hours ago         433MB release             1.0                 36e9ea407082        7 hours ago         433MB ubuntu              16.04               6a2f32de169d        6 days ago          117MB vault               latest              144fecac962b        3 weeks ago         64.4MB 

Python code:

import subprocess  output = subprocess.Popen(["docker", "images"], stdout=subprocess.PIPE)  result = output.communicate()[0].split("\n") image_list = []  for line in result[1:]:      if ("<none>" == line.split("  ")[0]):         image_list.append(filter(None,line.split("  "))[2])  for image in image_list:      #Piping both stdout and stderr to stdout.      output = subprocess.Popen(["docker", "rmi", "-f", image], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)      print(output.communicate()[0]) 

Final output:

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE release             3.1                 b6bf9d19cc6c        5 hours ago         869MB release             3.2                 b6bf9d19cc6c        5 hours ago         869MB release             1.0                 36e9ea407082        7 hours ago         433MB ubuntu              16.04               6a2f32de169d        6 days ago          117MB vault               latest              144fecac962b        3 weeks ago         64.4MB 

Please let me know if the code can be optimized or can be written in a more pythonic way.

  
       
       

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Dividiría la línea de la salida una vez y reutilizaría eso. Además, si no pasa un separador a calloc()1 , se dividirá en espacios en blanco, por lo que 99887766555443332 .

  calloc()3  

Probablemente cambiaría calloc()4 a calloc()5 para adherirse más de cerca a lo que quiere hacer. No estoy seguro de si puede suceder que el repositorio no sea ninguno, pero la etiqueta es.

También cambiaría la agrupación ligeramente, de modo que las cosas que pertenecen lógicamente se agrupan. Este es el primer paso para ponerlos en sus propias funciones, lo que podría ser un poco excesivo aquí, pero la haría mucho más fácil de reutilizar partes de esto:

  calloc()6  
 

I would split the line of the output once and re-use that. Also, if you don't pass a separator to str.split, it will split on whitespace, so "A B C".split() == ['A', 'B', 'C'].

import subprocess  output = subprocess.Popen(["docker", "images"], stdout=subprocess.PIPE) result = output.communicate()[0].split("\n")  image_list = [] for line in result[1:]:     line = line.split()     if line[0] == "<none>":         image_list.append(line[2])  for image in image_list:      #Piping both stdout and stderr to stdout.      output = subprocess.Popen(["docker", "rmi", "-f", image], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)      print(output.communicate()[0]) 

I would probably change if line[0] == "<none>" to if line[1] == "<none>" to adhere more closely to what you want to do. I'm not sure if it can happen that the repository is not none, but the tag is.

I would also change the grouping slightly, so that things which logically belong together are grouped. This is the first step towards putting them into their own functions, which could be slightly overkill here, but would make it a lot easier to re-use parts of this:

import subprocess   def get_docker_images():     output = subprocess.Popen(["docker", "images"], stdout=subprocess.PIPE)     return map(str.split, output.communicate()[0].split("\n")[1:-1])   def no_tag(images):     for image in images:         if image[1] == "<none>":             yield image   def delete_images(images):     for image in images:         output = subprocess.Popen(["docker", "rmi", "-f", image[2]],                                   stdout=subprocess.PIPE,                                   stderr=subprocess.STDOUT)         print(output.communicate()[0])   if __name__ == '__main__':     delete_images(no_tag(get_docker_images())) 
 
 
   
   

Relacionados problema

2  Dos formas de aleatorias aleatoriamente las tarjetas  ( Two ways to randomly shuffle cards ) 
Aquí hay dos implementaciones que escribí para aleatorizar las tarjetas. El primer método ( dt5 ) Selecciona una tarjeta aleatoria, luego lo quita al frent...

6  Compara el último tiempo de modificación con tiempo especificado  ( Compare last modification time with specfied time ) 
Estoy escribiendo una función en Python que compara el tiempo de modificación de un archivo en Linux (usando OS.STAT) con un tiempo específico y compare las f...

56  Proyecto Euler Problema 1 en Python - Múltiples de 3 y 5  ( Project euler problem 1 in python multiples of 3 and 5 ) 
Me gustaría sugerencias para optimizar esta solución de fuerza bruta a problema 1 . El algoritmo actualmente comprueba cada entero entre 3 y 1000. Me gustarí...

6  Unión profunda / recursiva, todos, cualquiera, suma, len  ( Deep recursive join all any sum len ) 
Sigo olvidando que el estándar join() solo puede tomar una sola itinerable, así que hice algunas funciones que actúen recursivamente en cualquier argumento ...

6  Diseño de un juego de acorazado simple en Python  ( Designing a simple battleship game in python ) 
Estoy tratando de codificar acorazado . Debe ser un juego de texto de un jugador contra la computadora donde el jugador de computadora y el jugador humano se...

3  Usuario rápido para algunos números, luego imprime el máximo y min  ( Prompt user for some numbers then print the max and min ) 
La función de este programa está solicitando repetidamente a un usuario para números enteros hasta que el usuario ingrese en 'done' . Una vez que se ingresa ...

2  Análisis de XML con doble etiquetas anidadas usando MINDOM  ( Parsing xml with double nested tags using mindom ) 
Quiero recuperar la identificación y el nombre por habilidad. Funciona pero esta bien hecho? Me gustaría quedarme con minidom, pero todos los consejos serán a...

61  Uso de funciones separadas para Project Euler 1  ( Using separate functions for project euler 1 ) 
Comencé a programar con Java y C ++, así que estoy acostumbrado a tener una función "principal" que llama a otras funciones que realizan el trabajo real. En l...

6  Comprobando una cuadrícula de palabras  ( Checking a word grid ) 
Escribí este programa donde puede ingresar x cantidad de palabras que de longitud x que comprueba si la cuadrícula se formó son las mismas palabras vertic...

4  Atomas Clone en Python  ( Atomas clone in python ) 
Aquí está mi clon de mierda de atomas , un juego de rompecabezas donde combina pequeños átomos en otros más valiosos. 9988776655544337 ¿Hay algún códig...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos