Estoy creando un script contenedor para ejecutar mis programas de python. La lógica es como:
Este es mi script contenedor:
import os import sys import argparse parse = argparse.ArgumentParser() parse.add_argument('command', help="give datacenter name") parse.add_argument('args', nargs=argparse.REMAINDER) parse_arguments = parse.parse_args() ''' Co-relate to the command and corresponding scripts to trigger ''' scripts = { 'verify' : '/path/verify.py' } if __name__ == '__main__': if parse_arguments.command not in scripts: print('These are the available scripts to run:') print('\n'.join(sorted(scripts.keys()))) else: os.execv(scripts.get(parse_arguments.command), [scripts.get(parse_arguments.command)] + parse_arguments.args) . Estoy ejecutando esto como,
$ docker run -it --rm --net host run-script verify --listenv tpc1 Traceback (most recent call last): File "/path/runme.py", line 28, in <module> os.execv(scripts.get(parse_arguments.command), [scripts.get(parse_arguments.command)] + parse_arguments.args) FileNotFoundError: [Errno 2] No such file or directoryMi imagen Docker es run-script
Si ejecuto el mismo código desde mi máquina local, funciona. pero dentro del contenedor muestra que este archivo no encuentra el error.
¿Puede alguien ayudarme con esto?
El primer argumento pasado a sys.argv es la ruta al archivo en ejecución, aquí /path/runme.py . El archivo se encuentra cuando se ejecuta desde su máquina local, pero probablemente no en el contenedor de la ventana acoplable (no estoy seguro de por qué).
Intente establecer el parámetro prog al instanciar su ArgParser, algo como:
parse = argparse.ArgumentParser(prog="run_me.py")Logré resolver este problema. El problema fue principalmente con el tinglado que proporcioné. Entonces, cuando estaba ejecutando el script en el contenedor docker, estaba verificando para ejecutar el código desde la ubicación shebang.
Diría que es un error de mi parte, FileNotFoundError no me estaba dando una pista de shebang. Finalmente, lo descubrí.
@ olinox14: gracias por su actualización, el parámetro "prog" en argparse me ayudó a generar un mejor mensaje de ayuda con el nombre del script en el contenedor de la ventana acoplable, en lugar de la ruta completa dentro del contenedor de la ventana acoplable.
os.execv(program, args) de forma predeterminada no busca el programa (primer argumento) en función de la variable de entorno PATH. os.execvp lo hace.
De la documentación de os.execv :
os.execv(path, args)Las variantes que incluyen una "p" cerca del final (execlp(), execlpe(), execvp() y execvpe()) utilizarán la variable de entorno PATH para ubicar el archivo del programa.
Entonces, os.execvp o proporcione la ruta completa al programa que se ejecutará en os.execv .