1oibkw8sjdg54bytey9lmqg.png

Esta publicación proporciona una guía paso a paso para configurar un entorno de desarrollo acoplado a Python con VScode y la extensión Dev Containers.

En la publicación anterior sobre este tema, Configurar un entorno Python dockerizado: de la forma más difícil, vimos cómo configurar un entorno de desarrollo Python acoplado a través de la interfaz de línea de comandos (CLI). En esta publicación, revisaremos un enfoque más elegante y sólido para configurar un entorno de desarrollo Python dockerizado usando VScode y el Contenedores de desarrollo extensión.

Artículos relacionados:

Al final de este tutorial, podrá configurar un entorno de desarrollo Python simple con VScode y la extensión Dev Containers.

Ilustración de VScode (creada por el autor con Midjourney)

Para seguir este tutorial, necesitará lo siguiente:

  • Docker Desktop (o equivalente) si está utilizando una máquina con sistema operativo macOS o Windows, o Docker instalado si está utilizando un sistema operativo Linux
  • Cuenta de Docker Hub para extraer la imagen
  • IDE de código VS y el Contenedores de desarrollo extensión instalada

A lo largo de este tutorial, usaremos la imagen oficial de Python: python:3.1o.

Todos los ejemplos de código de esta publicación están disponibles aquí:

Antes de comenzar, expliquemos qué es la extensión Dev Containers y cuándo debería considerar usarla.

En pocas palabras, la extensión VScode Dev Containers le permite abrir sin problemas una sesión VScode aislada dentro de un contenedor acoplable. El nivel de aislamiento incluye las siguientes tres capas:

  • Ambiente
  • Configuración de código VS
  • Extensiones de código VS

El devcontainer.json El archivo define la configuración de la sesión, lo que nos permite configurar y definir las tres capas anteriores.

Para configurar e iniciar la carpeta de su proyecto dentro de un contenedor con la extensión Dev Containers, necesitará los dos componentes siguientes:

  • Instala el Contenedores de desarrollo extensión
  • En la carpeta de su proyecto, cree una carpeta llamada .devcontainer y establecer un devcontainer.json archivo

El siguiente diagrama describe la arquitectura general de los contenedores de desarrollo:

La arquitectura de extensión Dev Containers (crédito a Rami Krispin)

Tras el lanzamiento, la extensión Dev Containers genera una nueva sesión de VScode dentro de un contenedor. De forma predeterminada, monta la carpeta local en el contenedor, lo que nos permite mantener el código persistente y sincronizado con nuestra carpeta local. Puede montar carpetas adicionales, pero esto está fuera del alcance de este tutorial.

En la siguiente sección, veremos cómo configurar un entorno Python con el devcontainer.json archivo.

Antes de comenzar con el devcontainer.json configuración, primero definamos el alcance del entorno de desarrollo. Debe incluir las siguientes características:

  • Pitón 3.10
  • Admite portátiles Jupyter
  • Instale las bibliotecas necesarias: bibliotecas compatibles con Pandas y VScode Jupyter
  • Instalar extensiones de soporte: Python y Jupyter

En las siguientes secciones, profundizaremos en la funcionalidad principal del devcontainer.json archivo. Comenzaremos con un entorno Python minimalista y demostraremos cómo personalizarlo agregando diferentes capas de personalización.

Construir versus imagen

El requisito principal para iniciar una sesión en contenedores con la extensión Dev Containers es definir la configuración de la imagen. Hay dos métodos para configurar la imagen:

  • Construya la imagen y ejecútela durante el tiempo de lanzamiento del contenedor con el build argumento. Este argumento le permite definir un Dockerfile para la compilación y pasar argumentos al docker build función. Una vez finalizado el proceso de compilación, iniciará la sesión dentro del contenedor.
  • Inicie la sesión con una imagen existente usando el image argumento

Dependiendo de los casos de uso, cada método tiene sus pros y sus contras. Deberías considerar usar el image argumento cuando se tiene una imagen que cumple plenamente con los requisitos del entorno. Asimismo, un buen caso de uso para el build El argumento es cuando tienes una imagen base pero necesitas agregar configuraciones de personalización menores.

En la siguiente sección, comenzaremos con un ejemplo simple de cómo iniciar un entorno Python usando el image argumento para importar la imagen oficial de Python (python:3.10).

Entorno básico de Python acoplado

El siguiente devcontainer.json El archivo proporciona un ejemplo sencillo para configurar un entorno Python. Utiliza el image argumento para definir el python:3.10 imagen como entorno de sesión:

devcontainer.json

{
"name": "Python Development Environment",
"image": "python:3.10"
}

El name El argumento define el nombre del entorno. En este caso lo configuramos como Entorno de desarrollo de Python.

Antes de iniciar el entorno, asegúrese de:

  • Su Docker Desktop (o equivalente) está abierto
  • Ha iniciado sesión en Docker Hub (o extrae por adelantado la imagen de Python)
  • El devcontainer.json El archivo se encuentra en la carpeta del proyecto bajo el .devcontainer carpeta:
.
└── .devcontainer
└── devcontainer.json

El código para este ejemplo está disponible. aquí.

Para iniciar una sesión, haga clic en el contenedor de desarrollo. >< símbolo en la parte inferior izquierda y seleccione el Reopen in Container opción como se muestra en la siguiente captura de pantalla:

Iniciar la sesión dentro de un contenedor con la extensión Dev Containers (captura de pantalla del autor)

Tenga en cuenta que durante el primer tiempo de inicio de la sesión, la extensión Dev Containers buscará la imagen definida por el image argumento (en este caso – python:3.10). Si la imagen no está disponible localmente, la extraerá de Docker Hub y puede tardar unos minutos. Luego, debería tomar unos segundos iniciar la sesión.

La sesión de VScode dentro de un contenedor (captura de pantalla del autor)

En la captura de pantalla anterior, puede ver el mapeo entre el devcontainer.json argumentos y la configuración de la sesión. El nombre de la sesión ahora está disponible en la parte inferior derecha (marcado en violeta) y alineado con el valor del name argumento. Del mismo modo, la sesión ahora se está ejecutando dentro del python:3.10 contenedor, y puede iniciar Python desde la terminal.

El contenedor de Python viene con las bibliotecas de Python predeterminadas. En la siguiente sección, veremos cómo podemos agregar más capas encima de la imagen base de Python con el build argumento.

Personalice el entorno Python con un Dockerfile

Ahora personalicemos el entorno anterior modificando el devcontainer.json. reemplazaremos el image discusión con elbuild argumento. El build El argumento nos permite construir la imagen durante el tiempo de inicio de la sesión con un Dockerfile y pasar argumentos al docker build función. Seguiremos el mismo enfoque que se demuestra en este correo para configurar el entorno de Python:

  • Importar el python:3.10 como imagen base
  • Establecer un entorno virtual
  • Instalar las bibliotecas necesarias

Usaremos el siguiente Dockerfile para configurar el entorno de Python:

Dockerfile

FROM python:3.10

ARG PYTHON_ENV=my_env

ENV PYTHON_ENV=$PYTHON_ENV

RUN mkdir requirements

COPY requirements.txt set_python_env.sh /requirements/

RUN bash ./requirements/set_python_env.sh $PYTHON_ENV

Usamos el FROM argumento para importar la imagen de Python, y el ARG y ENVargumentos para establecer el entorno virtual como argumento y variable de entorno. Además, utilizamos los dos archivos auxiliares siguientes para configurar un entorno virtual e instalar las bibliotecas necesarias:

  • requirements.txt — un archivo de configuración con una lista de bibliotecas necesarias. Para esta demostración, instalaremos la biblioteca Pandas, versión 2.0.3., y las bibliotecas de soporte de Jupyter (ipykernel, ipywidgets, jupyter). La biblioteca de ruedas es una biblioteca de soporte que maneja dependencias de C.
  • set_python_env.sh — un script bash auxiliar que configura un entorno virtual e instala las bibliotecas necesarias utilizando el requirements.txt archivo

requirements.txt

wheel==0.40.0
pandas==2.0.3
ipykernel
ipywidgets
jupyter

set_python_env.sh

#!/usr/bin/env bash

PYTHON_ENV=$1

python3 -m venv /opt/$PYTHON_ENV \
&& export PATH=/opt/$PYTHON_ENV/bin:$PATH \
&& echo "source /opt/$PYTHON_ENV/bin/activate" >> ~/.bashrc

source /opt/$PYTHON_ENV/bin/activate

pip3 install -r ./requirements/requirements.txt

Por último, pero no menos importante, usaremos el siguiente archivo de prueba para evaluar si la biblioteca Pandas se instaló correctamente e imprimir ¡Hola Mundo! mensaje:

test1.py

import pandas as pd

print("Hello World!")

Hagamos los cambios en el devcontainer.json archivo y reemplace el image discusión con el build argumento:

devcontainer.json

{
"name": "Python Development Environment",
"build": {
"dockerfile": "Dockerfile",
"context": ".",
"args": {
"PYTHON_ENV": "my_python_dev"
}
}
}

Los archivos para este ejemplo están disponibles. aquí.

El build Los subargumentos nos permiten personalizar la creación de la imagen pasando argumentos al docker build función. Usamos los siguientes argumentos para construir la imagen:

  • dockerfile — la ruta y el nombre del Dockerfile
  • context — establezca la ruta del sistema de archivos local para permitir el acceso a archivos con el COPY argumento durante el tiempo de construcción. En este caso, utilizamos la carpeta actual del devcontainer.json archivo (por ejemplo, el .devcontainer carpeta).
  • args — establece y pasa argumentos al contenedor durante el proceso de construcción. Usamos el PYTHON_ENV argumento para establecer el entorno virtual y nombrarlo como my_python_dev

Deberías tener los tres archivos: Dockerfile, requirements.txty set_python_env.sh almacenado bajo el .devcontainer carpeta, junto con el devcontainer.json archivo:

.
├── .devcontainer
│ ├── Dockerfile
│ ├── devcontainer.json
│ ├── requirements.txt
│ └── set_python_env.sh
└── test2.py

Ahora iniciemos la sesión usando la nueva configuración y probémosla con el test1.py archivo:

Ejecutar un script de Python para probar el entorno (captura de pantalla del autor)

Como puede observar en la captura de pantalla anterior, pudimos ejecutar con éxito el script de prueba desde la terminal (marcado en violeta) e imprimió el ¡Hola Mundo! mensaje como se esperaba (marcado en verde). Además, el entorno virtual que configuramos en la imagen (my_python_dev) se carga de forma predeterminada (marcado en amarillo).

En la siguiente sección, veremos cómo personalizar la configuración de VScode de la sesión de Dev Containers.

Personalizar la configuración de VScode

Una de las grandes características de la extensión Dev Containers es que aísla la configuración de la sesión de la configuración principal de VScode. Esto significa que puede personalizar completamente la configuración de VScode a nivel de proyecto. Extiende la reproducibilidad del entorno de desarrollo más allá de la configuración de Python o del sistema operativo. Por último, pero no menos importante, hace que la colaboración con otros o el trabajo en varias máquinas sea fluido y eficiente.

Concluiremos este tutorial con el siguiente ejemplo, donde vemos cómo personalizar la configuración de VScode con el customizations argumento. Agregaremos el argumento al ejemplo anterior y usaremos el vscode subargumento para establecer el intérprete de Python predeterminado del entorno y las extensiones requeridas:

devcontainer.json

{
"name": "Python Development Environment",
"build": {
"dockerfile": "Dockerfile",
"context": ".",
"args": {
"PYTHON_ENV": "my_python_dev"
}
},
"customizations": {
"vscode": {
"settings": {
"python.defaultInterpreterPath": "/opt/my_python_dev/bin/python3",
"python.selectInterpreter": "/opt/my_python_dev/bin/python3"
},
"extensions": [
"ms-python.python",
"ms-toolsai.jupyter"
]
}
}
}

Los archivos para este ejemplo están disponibles. aquí.

Usamos el settings Argumento para definir el entorno virtual de Python como se define en la imagen. Además, utilizamos el extensions argumento para instalar el Pitón y Jupyter extensiones de soporte.

Nota: La ruta del entorno virtual definida por el tipo de aplicación que se utilizó para configurar el entorno. como usamos venv y lo nombró como my_python_devel camino es opt/my_python_dev/bin/python3.

Después de agregar la extensión de Python, podemos iniciar scripts de Python usando el complemento de extensión, como se muestra en la captura de pantalla a continuación. Además, podemos ejecutar el código Python aprovechando la extensión Juptyer, de forma interactiva:

En este tutorial, revisamos cómo configurar un entorno Python dockerizado con VScode y la extensión Dev Containers. La extensión Dev Containers hace que la integración de contenedores con el flujo de trabajo de desarrollo sea fluida y eficiente. Vimos cómo, con unos simples pasos, podemos configurar y personalizar un entorno Python dockerizado usando el devcontainer.json archivo. Revisamos los dos enfoques para configurar la imagen de la sesión con el image y build argumentos y establecer extensiones con el customizations argumento. Hay opciones de personalización adicionales que no se trataron en este tutorial y recomiendo consultarlas:

  • Definir variables de entorno.
  • Montar volúmenes adicionales
  • Establecer argumentos para el docker run dominio
  • Ejecutar comando posterior al lanzamiento

Si está interesado en profundizar en más detalles, le recomiendo consultar este tutorial: