es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Creación de un ambiente Conda pero excluyendo paquetes de desarrollo local?

Tengo un archivo environment.yml que crea el entorno:

name: blah
channels:
  - conda-forge
dependencies:
  - python=3.9
  - psychopg2
  # THESE ARE FOR LOCAL DEV ONLY
  - jupyter
  - ipykernel
  - folium

Existe un gran ahorro en el tamaño de la imagen de Docker si se excluyen los paquetes de desarrollo local en producción. Sin embargo, esos paquetes son necesarios para las pruebas locales en las máquinas de desarrollo, etc.

Mi solución actual es mantener un archivo environment_local.yml separado para ejecutarlo localmente, que incluye estos paquetes, pero ejecutar environment.yml durante la construcción de Docker que los excluye. Pero existe el potencial de que los archivos se desincronicen en las dependencias compartidas.

¿Existe alguna manera de excluir paquetes del entorno según una bandera de línea de comando? ¿O los archivos de entorno pueden heredarse y extenderse entre sí?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Python, dependencias y conda, existen varias formas de excluir paquetes del entorno en función de un indicador de línea de comandos.

    Una opción es aprovechar el comando conda-env para crear un nuevo entorno sin los paquetes de desarrollo locales si se especifica un indicador determinado. Puede lograr esto creando dos archivos environment.yml separados – uno con los paquetes de desarrollo locales y otro sin ellos – y luego cambiando entre ellos en función de la indicación. Por ejemplo:

    if [ "$ENV" == "production" ]; then
        conda env create --file environment.yml --name blah --prune
    else
        conda env create --file environment_local.yml --name blah --prune
    fi
    

    Esto asegura que se cree el entorno apropiado en función del indicador. Sin embargo, como se señaló en la pregunta, existe el potencial de que los archivos se desincronicen en las dependencias compartidas.

    Otra solución es aprovechar la capacidad de conda para crear variantes de entornos. Al utilizar variantes de entornos, puede heredar y extender archivos de entorno, lo que le permite cambiar fácilmente entre diferentes contextos de construcción sin duplicar dependencias. Puede lograr esto creando un archivo base environment.yml con dependencias compartidas, y luego creando dos archivos variantes de entorno separados – uno con los paquetes de desarrollo locales y otro sin ellos – que extienden el archivo base. Aquí hay un ejemplo:

    base.yml:

    name: blah
    channels:
      - conda-forge
    dependencies:
      - python=3.9
      - psychopg2
    

    local-dev.yml:

    name: blah-local-dev
    dependencies:
      - jupyter
      - ipykernel
      - folium
    

    production.yml:

    name: blah-production
    

    Para crear el entorno de desarrollo local, puede ejecutar:

    conda env create --file base.yml -n blah-local-dev --prune --quiet --clone base
    conda env update --file local-dev.yml --prune --quiet --name blah-local-dev
    

    Y para crear el entorno de producción sin paquetes de desarrollo locales, puede ejecutar:

    conda env create --file base.yml -n blah-production --prune --quiet --clone base
    

    Esto asegura que los paquetes de desarrollo locales se excluyan de los entornos de producción, permitiendo al mismo tiempo una fácil prueba local sin duplicar dependencias ni preocuparse por la falta de sincronización de archivos.

Comments are closed.