Cómo acoplar aplicaciones Python con Miniconda [A Hybrid Approach]

Qué tal aquí Kiko. Os traigo un nuevo post sobre el sistema operativo mas molón. Encantado linuxeros.

Si está familiarizado con Docker, probablemente sepa que puede crear una imagen personalizada de Docker con Dockerfile. Escribí para obtener más detalles.

Cómo crear una imagen de Docker personalizada con Dockerfile [very Easy]

El verdadero poder de Docker radica en ajustar la imagen básica de Docker a sus requisitos. Con esto, puede implementar fácil y rápidamente un entorno Linux personalizado ejecutando un contenedor desde esa imagen en una ventana acoplable personalizada.

En este tutorial te mostraré cómo seguir la misma idea, pero solo para aplicaciones Python. Esto será útil tanto para usuarios como para desarrolladores.

Usaré una imagen mínima de Python. Una vez que cambie y modifique esta imagen, ya no tendrá que preocuparse por instalar la aplicación Python en diferentes sistemas operativos. Podrá iniciar su aplicación Python con Docker inmediatamente cada vez. Entonces, ¡puedes decirle adiós a estos contratiempos basados ​​en el host!

Crea una imagen de Docker para tu aplicación Python

Usaré Miniconda aquí. Miniconda es un instalador mínimo gratuito para condominio y le ofrece una versión pequeña y rápida de Anaconda con lo que necesita para ejecutar aplicaciones Python.

¿Por qué Miniconda?

Entonces, ¿por qué estoy usando Miniconda aquí? Hay más de una razón:

Cuando instala Miniconda en un host, en realidad no está utilizando la versión de Python proporcionada por el administrador de paquetes del sistema operativo. Miniconda se instala en un lugar separado con su propio entorno Python. Por lo tanto, esto le proporciona un nivel adicional de aislamiento cuando se realiza en un contenedor Docker.

Debido al punto anterior, obtienes otra ventaja: porque usas conda que Miniconda está instalado, puede usar esta herramienta para cambiar la versión correspondiente de Python de su aplicación cuando sea necesario. Esta es una gran ayuda para los desarrolladores de aplicaciones que se basan en diferentes versiones de Python 3: también pueden ser 3.6, 3.7, 3.8, 3.9 o anteriores.

Por ejemplo, si usa Python 3.9 de forma predeterminada, pero su aplicación Python requiere Python 3.7 debido a las dependencias correspondientes, ¿qué haría?

Aquí es donde conda puedo ayudarte. Puedes correr con eso conda install python=3.7 para cambiar la versión requerida de Python instalándola con todas las dependencias necesarias.

Miniconda le permite instalar aplicaciones en Python 2 y Python 3. Sin embargo Python 2 está oficialmente muerto, aún puede probar aplicaciones más antiguas en la parte superior de este entorno sin tener que verificar su nuevo puerto Python 3 con 2 a 3. También hay muchos usos en los que una aplicación de Python que se ejecuta en Miniconda busca dependencias que no son de Python en el lado del host (p. Ej. g++). ¡Este es el momento en el que la potencia combinada de Miniconda y Docker se convierte en una gran solución! ¿Olvidé mencionar que también puede crear y activar sus propios entornos de aplicación Python con conda? ¡Aislamiento de nuevo! Siempre puede cambiar entre la versión estándar de Python del contenedor Docker y el contenedor Miniconda en cualquier momento. Esto le brinda más flexibilidad, ya que siempre puede restaurar una nueva imagen con el cambio cuando lo desee.

Entonces, ¡pasemos a crear la nueva imagen de la aplicación Python con Miniconda y Docker!

Suposición

Si aún no lo ha hecho, instale Docker en Ubuntu o cualquier distribución de Linux que utilice. Asegúrese de agregarlo al grupo de la ventana acoplable para que pueda iniciar la ventana acoplable sin sudo. Necesitará una conexión a Internet activa para descargar la imagen de la base principal.

Para una aplicación de muestra de Python, solo uso «¡Hola mundo!» ejemplo llamado python-app.pypara que le resulte más fácil descubrir cómo ejecutarlo a través de la Miniconda de Docker.

Una aplicación Python completa que use diferentes bibliotecas de Python se beneficiaría significativamente del mismo procedimiento, especialmente debido a las diferentes disposiciones de dependencia de Miniconda.

Paso 1: toma una imagen de Docker [optional]

En este ejemplo, elegí Python Slim en su lugar Linux alpino. Este último es realmente pequeño, pero puede tener un impacto significativo. productividad cuando se trata de ejecutar aplicaciones. Sin embargo, Python Slim tiene un tamaño de aproximadamente 40 MB, basado en Debian Buster y Python 3.9.1.

Este paso es opcional. Lo encendí para mostrar que puedes compararlo con la imagen personalizada de la aplicación Python, como en el tutorial anterior de Dockerfile.

Arrastre la última imagen de la ventana acoplable Python Slim usando docker pull equipo:

docker pull python:slim

Paso 2: crea un Dockerfile con la personalización necesaria

Ahora creemos un nuevo archivo vacío llamado Dockerfile usando el comando touch. Pero primero cree un directorio para su aplicación Docker.

mkdir python-docker
cd python-docker
touch Dockerfile

Aplicaré el Dockerfile completo a continuación, una vez que haya completado la explicación de los pasos en el proceso de creación de imágenes a través de un recorrido paso a paso del archivo.

A continuación, le indicamos cómo comenzar y progresar en la creación de imágenes:

Prepara la imagen principal

Actualice los últimos paquetes predeterminados utilizando Python Slim como imagen principal.

FROM python:slim
RUN apt-get update && apt-get -y upgrade 

Instalar dependencias distintas de Python

Instale todas las dependencias que no sean de Python para su aplicación de Python (digamos g++ y cualquier otro según sus requisitos).

  && apt-get install -y --no-install-recommends 
    git 
    wget 
    g++ 
    gcc 
    ca-certificates 
    && rm -rf /var/lib/apt/lists/*

Git y Wget puede ser muy útil al recuperar aplicaciones Python de diferentes repositorios y URL. Finalmente, limpie un área pequeña con rm -rf /var/lib/apt/lists/* para minimizar el tamaño final de la imagen de Docker.

Instalar Miniconda

Una vez instalado, Miniconda se actualiza .bashrc para actualizar a su propia versión de Python.

ENV PATH="/root/miniconda3/bin:$PATH"
ARG PATH="/root/miniconda3/bin:$PATH"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 
    && mkdir /root/.conda 
    && bash Miniconda3-latest-Linux-x86_64.sh -b 
    && rm -f Miniconda3-latest-Linux-x86_64.sh 

Aquí se establece una variable de entorno dentro de la ruta del sistema del contenedor. ENV está diseñado para los contenedores en los que trabajará en la imagen y ARG está diseñado para contenedores intermedios que se crean mientras se construyen por primera vez.

Entonces, la diferencia entre ENV y ARG Las instrucciones en el bloque de código anterior es que este último solo está disponible mientras se construye la imagen. Mira esta hermosa explicación aquí.

C wget, descargue la última versión de Miniconda del repositorio oficial de Anaconda. Después de crear el directorio de configuración raíz, instálelo y finalmente elimine el instalador.

Configurar Miniconda para Bash Shell

Después de instalar Miniconda, muestre el número de versión para confirmarlo e inicialícelo en el shell Bash para el contenedor. La segunda fila actualizaciones defecto .bashrc expediente:

	&& echo "Running $(conda --version)" && 
    conda init bash && 

Recargar Bash con los nuevos cambios

Vuelva a cargar Bash para que el sistema de compilación Docker se actualice a la versión Miniconda Python, no a Debian (la imagen principal del sistema operativo).

	. /root/.bashrc && 

También actualice los paquetes actuales de Miniconda incluidos por defecto.

	conda update conda && 

Prepare un entorno Conda para su aplicación

Cree y active un entorno Conda separado para su aplicación Python.

    conda create -n python-app && 
    conda activate python-app && 

Instale la versión apropiada de Python que necesita para su aplicación. Suponiendo que su aplicación se basa en Python 3.6, configure esta versión en el nuevo entorno virtual Pepita, que también es muy útil a la hora de gestionar aplicaciones Python.

    conda install python=3.6 pip && 

Instala tu aplicación Python

Dependiendo de cómo use su aplicación, puede:

I. Instalarlo con pip que convencionalmente usado setup.py archivo disponible en su repositorio. Esta es la misma herramienta que se está discutiendo más temprano pero aquí lo uso en lugar de Conda.

	git clone replace-me-with-repo-url
	cd repo-name
	pip install -e .

ii. ..o ejecutarlo directamente con python equipo:

	git clone replace-me-with-repo-url
	cd repo-name
	python python-app.py

En la demostración de Dockerfile usaré «¡Hola mundo!» ejemplo para que le resulte más fácil descubrir cómo puede ejecutarlo directamente iniciando un contenedor o dentro de su shell bash con Docker. Entonces digamos que uso la segunda forma:

    echo 'print("Hello World!")' > python-app.py

Ahora que he incluido la fila superior, se llama archivo python-app.py fue creado para generar el mensaje Hello World cuando lo ejecuta con el comando python python-app.py.

Actualice el archivo .bashrc para su aplicación como lo hace Miniconda:

El instalador de Miniconda actualiza automáticamente el archivo .bashrc después de iniciar conda init bash como se mostró anteriormente. Puede hacer lo mismo con su aplicación Python. Cada vez que ejecute el contenedor bash, el entorno se activará y también podrá usar el nombre de su aplicación Python como comando para ejecutarlo. Aquí usé el nombre como python-app:

RUN echo 'conda activate python-app n
alias python-app="python python-app.py"' >> /root/.bashrc

Preparar la solicitud para su ejecución final.

Finalmente, creo un punto de entrada y le asigno un comando que le permitirá ejecutarlo cada vez que lance un contenedor basado en esta imagen:

ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

Complete el Dockerfile

Puede utilizar un editor como Vim o Nano o usar cat comando para agregar las líneas discutidas anteriormente a Dockerfile.

FROM python:slim
RUN apt-get update && apt-get -y upgrade 
  && apt-get install -y --no-install-recommends 
    git 
    wget 
    g++ 
    ca-certificates 
    && rm -rf /var/lib/apt/lists/*
ENV PATH="/root/miniconda3/bin:$PATH"
ARG PATH="/root/miniconda3/bin:$PATH"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 
    && mkdir /root/.conda 
    && bash Miniconda3-latest-Linux-x86_64.sh -b 
    && rm -f Miniconda3-latest-Linux-x86_64.sh 
    && echo "Running $(conda --version)" && 
    conda init bash && 
    . /root/.bashrc && 
    conda update conda && 
    conda create -n python-app && 
    conda activate python-app && 
    conda install python=3.6 pip && 
    echo 'print("Hello World!")' > python-app.py
RUN echo 'conda activate python-app n
alias python-app="python python-app.py"' >> /root/.bashrc
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

Cuando pruebe su propia aplicación, reemplácela echo 'print("Hello World!")' > python-app.py alinee la parte superior con cualquiera de los dos métodos descritos en la sección anterior Instalación de su aplicación Python.

Paso 3: compila la imagen de la aplicación Python con Dockerfile

Como ya sabrá, el comando para construir la imagen desde Dockerfile se ve así:

docker build -t python-app PATH_to_Dockerfile

Utilice el marcador -t para especificar el nombre de la imagen de Docker para su aplicación. Lo configuré como python-app en el comando de muestra anterior.

Dado que Dockerfile está en su directorio actual, puede crear la nueva imagen de Docker de su aplicación Python de la siguiente manera:

docker build -t python-app .
avimanyu@iborg-desktop:~/python-docker$ docker build -t python-app .
Sending build context to Docker daemon   2.56kB
Step 1/8 : FROM python:slim
 ---> 677f7ac99e48
Step 2/8 : RUN apt-get update && apt-get -y upgrade   && apt-get install -y --no-install-recommends     git     wget     g++     ca-certificates     && rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 15ee9c47c83b
Step 3/8 : ENV PATH="/root/miniconda3/bin:$PATH"
 ---> Using cache
 ---> cfd5ed6b5ec9
Step 4/8 : ARG PATH="/root/miniconda3/bin:$PATH"
 ---> Using cache
 ---> e70d06b5ff10
Step 5/8 : RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh     && mkdir /root/.conda     && bash Miniconda3-latest-Linux-x86_64.sh -b     && rm -f Miniconda3-latest-Linux-x86_64.sh     && echo "Running $(conda --version)" &&     conda init bash &&     . /root/.bashrc &&     conda update conda &&     conda create -n python-app &&     conda activate python-app &&     conda install python=3.6 pip &&     echo 'print("Hello World!")' > python-app.py
 ---> Using cache
 ---> 8a7957a6abb2
Step 6/8 : RUN echo 'conda activate python-app nalias python-app="python python-app.py"' >> /root/.bashrc
 ---> Running in e3193e93b631
Removing intermediate container e3193e93b631
 ---> 948f45eb6024
Step 7/8 : ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
 ---> Running in 621624951dcf
Removing intermediate container 621624951dcf
 ---> 6e8824889502
Step 8/8 : CMD ["python python-app.py"]
 ---> Running in dc97f9d0d8fe
Removing intermediate container dc97f9d0d8fe
 ---> 01bae0a9903c
Successfully built 01bae0a9903c
Successfully tagged python-app:latest

El resultado anterior se basa en datos almacenados en caché, pero cuando lo ejecuta por primera vez, tomará algo de tiempo y dará como resultado un resultado de registro mucho más largo.

Ahora, verifiquemos si su imagen de Docker modificada tiene instalada la aplicación de muestra iniciando un contenedor desde ella:

docker run python-app
avimanyu@iborg-desktop:~/python-docker$ docker run python-app
Hello World!

Entonces, con Docker y Miniconda, ¡ahora puede ejecutar el programa directamente sin la necesidad de preinstalación! A partir de ahora, todo lo que necesitas es la imagen.

Entremos ahora en el shell bash dentro de este contenedor:

docker run -ti python-app bash
avimanyu@iborg-desktop:~/python-docker$ docker run -ti python-app bash
(python-app) root@2ceec4c9eaa4:/# 

Como puede ver, ahora se encuentra en el entorno habilitado para Conda que creó anteriormente con Dockerfile. El -ti flag se utiliza para crear una terminal interactiva para usted. Ahora puede utilizar alternativamente el comando nickname para iniciar la aplicación:

(python-app) root@2ceec4c9eaa4:/# python-app
Hello World!

Confirmemos también que en realidad está utilizando la versión de Miniconda Python, no la versión predeterminada de Python:

(python-app) root@2ceec4c9eaa4:/# python --version
Python 3.6.12 :: Anaconda, Inc.

Como mencioné anteriormente, Miniconda es una versión miniaturizada de Anaconda.

Una vez que haya configurado todo, puede prensa tu imagen final para Docker Hub si está alojando una aplicación de código abierto Python GitHub,, GitLab,, Gitea,, Bitbucket u otro almacenamiento.

Salga del contenedor escribiendo una salida en la terminal. Detenga el contenedor, retire el contenedor y elimine las imágenes de Docker (si lo desea) para liberar espacio en el disco.

¡Felicidades! Acaba de aprender a crear su propia imagen de Docker para su aplicación Python.

¿Te resultó útil?

Como puede ver, Miniconda no solo lo ayuda a hacer que su aplicación sea más flexible y preparada para el futuro a nivel de usuario, sino que también simplifica enormemente la función de desarrollador.

Piensa en lo cómodo que sería configurar esto s PyCharm!! Instalas Miniconda y tu aplicación Python como lo haces en un sistema host, pero debido a que la compilas y la guardas como una imagen de Docker, ¡se convierte en un proceso de una sola vez!

Si lo desea, puede experimentar con los diferentes ejemplos que se muestran en este tutorial anterior en lugar de «¡Hola mundo!» ejemplo que utilicé en este.

¡Espero que esto ayude! Si tiene preguntas o sugerencias, deje un comentario a continuación.

Este Blog lo escribimos para ayudar y servir de ayuda a la comunidad Linux. Esperamos que os guste.

Leave a Reply