Si has tenido la oportunidad de ver alguno de mis vídeos en mi canal de YouTube, te habrás dado cuenta de que soy súper fan de Dev Containers y que cada vez tengo que desarrollar (o ayudar) en un nuevo proyecto siempre animo a que todo se haga dentro de estos contenedores para el desarrollo.
En este artículo quiero compartir contigo mi configuración para usar el emulador de CosmosDB con Python tanto en Dev Containers como en GitHub Codespaces.
.devcontainer/devcontainer.json
Lo primero que necesitas es definir el archivo de configuración .devcontainer/devcontainer.json
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/python
{
"name": "Python 🐍 + CosmosDB emulator 🪐",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
// "image": "mcr.microsoft.com/devcontainers/python:1-3.12-bullseye"
"dockerComposeFile": "compose.yaml",
"service": "app",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [8081],
"portsAttributes": {
"8081": {
"label": "Cosmos DB Emulator",
"onAutoForward": "notify",
"protocol": "https"
}
},
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": ".devcontainer/post-create.sh && pip install -r requirements.txt",
"customizations": {
"vscode": {
"extensions": [
"ms-azuretools.vscode-cosmosdb",
"GitHub.copilot",
"GitHub.copilot-chat"
]
}
}
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
Como puede ver, en este archivo hago uso de un par de archivos más, un compose.yaml porque necesito crear una configuración multi-contenedor, que incluya tanto el workspace donde desarrollaré mi aplicación en Python y otro que ejecute el emulador de CosmosDB.
compose.yaml
services:
app:
image: mcr.microsoft.com/devcontainers/python:1-3.12-bullseye
volumes:
- ../..:/workspaces:cached
command: sleep infinity
depends_on:
- cosmosdb
cosmosdb:
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator
environment:
AZURE_COSMOS_EMULATOR_PARTITION_COUNT: 6
AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE: "true"
ports:
- "8081:8081"
volumes:
- cosmosdb-data:/var/opt/data
volumes:
cosmosdb-data:Y un último que me permite instalar el certificado que genera el emulador en el contenedor app para poder interactuar con este.
#!/usr/bin/env bash
set -euxo pipefail
COSMOSDB_EMU_ENDPOINT=https://cosmosdb:8081
WAIT_TIMEOUT=2
until sudo curl -ksf "${COSMOSDB_EMU_ENDPOINT}/_explorer/emulator.pem" -o '/usr/local/share/ca-certificates/emulator.crt'; do
echo "Waiting for emulator to be ready..."
sleep $WAIT_TIMEOUT
done
sudo update-ca-certificatesCon esto tendrías todo lo que necesitas para poder arrancar este entorno usando Dev Containers. Ahora solo nos queda probarlo 🤓
Cómo probar la configuración
Para probar que esta configuración funciona correctamente puedes lanzar este código, ubicado en el archivo app.py del repo que te comparto:
from azure.cosmos import CosmosClient, PartitionKey
import urllib3
urllib3.disable_warnings()
client = CosmosClient(
url="https://cosmosdb:8081",
credential=(
"C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGG"
"yPMbIZnqyMsEcaGQy67XIw/Jw=="
),
connection_verify=False
)
database = client.create_database_if_not_exists(
id="cosmicworks",
offer_throughput=400,
)
container = database.create_container_if_not_exists(
id="products",
partition_key=PartitionKey(
path="/id",
),
)
item = {"id": "68719518371", "name": "Kiama classic surfboard"}
container.upsert_item(item)Importante a tener en cuenta en este caso, ya que el emulador no «vive en localhost», es que hay que deshabilitar la comprobación del certificado y que, para que este Python no lance warnings cada vez que hacemos algo con la base de datos utilizo estas líneas:
import urllib3
urllib3.disable_warnings()Para finalizar, puedes ver el Data Explorer que proporciona el emulador usando https://localhost:8081/_explorer/index.html o si estás en GitHub Codespaces puedes hacer uso de este echo para recuperar la URL de tu entorno:
echo "https://$CODESPACE_NAME-8081.app.github.dev/_explorer/index.html"El repo con el código de ejemplo lo tienes en mi cuenta de GitHub.
¡Saludos 👋🏻!
