¿Cómo se desarrolla iterativamente su aplicación usando Docker? Recién comencé a usarlo y mi flujo de trabajo es muy lento, así que estoy bastante seguro de que lo estoy usando mal.
Estoy siguiendo un curso de aprendizaje automático de python en Youtube, por lo que estoy usando Docker para trabajar con python 3. Sé que puedo usar virtualenv o una VM, pero también quiero aprender Docker, así que tengan paciencia conmigo.
Mi directorio raíz se ve así:
Dockerfile main.py*
Mi archivo docker:
FROM python COPY . /src RUN pip install quandl RUN pip install pandas CMD ["python", "/src/main.py"]
Y el archivo Python:
#!/usr/bin/env python import pandas as pd import quandl print("Hello world from main.py") df = quandl.get("WIKI/GOOGL") print("getting data frame for WIKI/GOOGL") print(df.head())
Mi flujo de trabajo ha sido:
docker build -t myapp .
docker run my app python /src/main.py
Preguntas:
¿Cómo puedo acelerar todo esto? Por cada cambio que quiero intentar, termino reconstruyendo. Esto hace que pip obtenga dependencias cada vez, lo que lleva demasiado tiempo.
En lugar de editar un archivo de python y ejecutarlo, ¿cómo podría obtener un shell interactivo de la versión de python que se ejecuta en el contenedor?
Si quisiera que mi programa escribiera un archivo, ¿cómo podría devolver este archivo a mi sistema local desde el contenedor después de que el programa haya finalizado?
¡Gracias por la ayuda!
Editar: debo agregar, este fue el tutorial que estaba siguiendo en general para ejecutar un código de Python en Docker:https://www.civisanalytics.com/blog/using-docker-to-run-python/
Lo más simple que puede hacer es reordenar su Dockerfile.
FROM python RUN pip install quandl RUN pip install pandas COPY . /src CMD ["python", "/src/main.py"]
La razón por la que esto ayuda es que Docker reutilizará la compilación almacenada en caché para los comandos que ya ha ejecutado. Ahora, cuando reconstruya después de modificar su código fuente, reutilizará los resultados de la compilación para los comandos pip
, ya que no es necesario volver a ejecutarlos. Solo ejecutará el paso COPY
.
Puede ejecutar un shell en el contenedor en ejecución y ejecutar su comando python.
docker exec -it <container-id> bash python <...>
O bien, puede ejecutar un contenedor con solo un shell y omitir la ejecución de su aplicación por completo (luego, ejecútela como desee).
docker run -it <image> bash python <...>
Monte un directorio externo en el contenedor. Luego escriba en la ruta montada.
docker run -v /local/path:/path <.. rest of command ..>
Luego, cuando escriba en el contenedor en /path/file
, el archivo aparecerá fuera del contenedor en /local/path/file
.