registrarse que pagina hub espaƱol ejemplos crear contenedor con compose python linux docker dockerpy

python - pagina - que es docker hub



Capturar la salida del script de Python ejecutado dentro de un contenedor docker (2)

El objetivo aquí es utilizar un contenedor de ventana acoplable como una caja de arena segura para ejecutar scripts Python no confiables, pero hacerlo desde Python utilizando el módulo docker-py, y poder capturar la salida de ese script.

Estoy ejecutando un script de python foo.py dentro de un contenedor docker (está configurado como el comando ENTRYPOINT en mi Dockerfile, por lo que se ejecuta tan pronto como se ejecuta el contenedor) y no puedo capturar la salida de ese script. Cuando ejecuto el contenedor a través del CLI normal usando

docker run -v /host_dirpath:/cont_dirpath my_image

( host_dirpath es el directorio que contiene foo.py) Obtengo la salida esperada de foo.py impresa en stdout, que es solo un diccionario de pares clave-valor. Sin embargo, estoy tratando de hacer esto desde Python usando el módulo docker-py, y de alguna manera la salida del script no está siendo capturada por el método de logs . Aquí está el código de python que estoy usando:

from docker import Client docker = Client(base_url=''unix://var/run/docker.sock'', version=''1.10'', timeout=10) contid = docker.create_container(''my_image'', volumes={"/cont_dirpath":""}) docker.start(contid, binds={"/host_dirpath": {"bind": "/cont_dirpath"} }) print "Docker logs: " + str(docker.logs(contid))

Lo que solo da como resultado "registros de Docker:": no se captura nada en los registros, ni stdout ni stderr (intenté generar una excepción dentro de foo.py para probar esto).

Los resultados que estoy buscando son calculados por foo.py y actualmente se imprimen en stdout con una declaración de print python. ¿Cómo puedo incluir esto en los registros del contenedor de la ventana acoplable para poder leerlo desde Python? ¿O capturar esta salida de alguna otra manera desde fuera del contenedor?

Cualquier ayuda sería muy apreciada. ¡Gracias por adelantado!

EDITAR:

Aún no hay suerte con docker-py, pero está funcionando bien cuando se ejecuta el contenedor con el CLI normal usando subprocess.Popen: la salida es capturada correctamente por stdout cuando se hace esto.


Está experimentando este comportamiento porque Python almacena sus salidas de forma predeterminada.

Tomemos este ejemplo:

vagrant@docker:/vagrant/tmp$ cat foo.py #!/usr/bin/python from time import sleep while True: print "f00" sleep(1)

luego, observar los registros de un contenedor que se ejecuta como demonio no muestra nada:

vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app dockerfile/python python /app/foo.py)

pero si deshabilitas la salida en búfer de python con el parámetro de línea de comando -u , todo aparece:

vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app dockerfile/python python -u /app/foo.py) f00 f00 f00 f00

También puede inyectar la variable de entorno PYTHONUNBUFFERED :

vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app -e PYTHONUNBUFFERED=0 dockerfile/python python /app/foo.py) f00 f00 f00 f00

Tenga en cuenta que este comportamiento afecta solo a los contenedores que se ejecutan sin el parámetro -t o --tty .


Puede experimentar una condición de carrera ya que el contenedor iniciado se ejecuta en paralelo a su programa de control. Debe esperar a que su contenedor comience y termine antes de agarrar los registros. Agregue un docker. Espere a su código justo después de docker.start.

docker.wait(contid)

Su salida parece vacía porque aún no se ha registrado nada.