Activar entorno virtual para toda la ejecución de IRIS
Hola a todos.
Tras intentar de ejecutar métodos Python en el docker intersystemsdc/irishealth-community, que no permite ahora ejecutar ningún método con Python, decidí dejar esta versión y empezar a trabajar con containers.intersystems.com/intersystems/iris-community.
En este entorno si funcionan los método de Python y ya era un paso bastante grande.
Intento importar mis liberarías con pip install -r requirements.txt pero, como muy buena medida de seguridad, me impide que se realice este cambio en la librería general, por lo que requiere que esta instalación se realice en un entorno virtual.
Tengo el siguiente código en Dockerfile
ARG IMAGE=containers.intersystems.com/intersystems/iris-community:latest-em
FROM $IMAGE
USER root
WORKDIR /opt/irisbuild
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/irisbuild
USER ${ISC_PACKAGE_MGRUSER}
COPY src src
COPY data data
COPY iris.script iris.script
COPY requirements.txt requirements.txt
RUN python3 -m venv ${ISC_PACKAGE_INSTALLDIR}/.venv
RUN bash -c "source \"${ISC_PACKAGE_INSTALLDIR}/.venv/bin/activate\" && pip install -U -r requirements.txt"
RUN export IRIS_PYTHON_PATH=${ISC_PACKAGE_INSTALLDIR}/.venv/bin/
RUN iris start IRIS \
&& iris session IRIS < iris.script \
&& iris stop IRIS quietly
Si accedo luego por terminal, veo que realmente se han instalado los paquetes en el entorno virtual, pero si quiero utilizarlo en una clase de IRIS, no puede acceder porque la aplicación no tiene levantado el entorno virtual.
He consultado en varios foros y no me deja muy claro como hay que configurar mi instancia de IRIS para que tenga acceso a los paquetes instalados en el entorno virtual.
En el fichero docker-compose.yml tengo este valor en la sección environment
environment:
- IRIS_PYTHON_PATH=/usr/irissys/.venv/bin/
Comments
IRIS no “activa” automáticamente un entorno virtual de Python para Embedded Python. En el material recuperado se describen dos formas compatibles de trabajar con paquetes:
- instalar los paquetes directamente en la carpeta
mgr/pythonde IRIS usandopip --target, o - usar un entorno virtual y añadir explícitamente su directorio
site-packagesasys.pathantes de importar módulos. [1]
Para el caso de un entorno virtual, lo que se muestra es añadir la ruta de site-packages, no la carpeta bin. El ejemplo recuperado es este: [1]
set sys = ##class(%SYS.Python).Import("sys")
do sys.path.append("/where/you/want/your/venv/lib/pythonX.X/site-packages")
set requests = ##class(%SYS.Python).Import("requests")
Por eso, definir IRIS_PYTHON_PATH=/usr/irissys/.venv/bin/ en docker-compose.yml no aparece en el material recuperado como mecanismo para que Embedded Python encuentre paquetes del entorno virtual. Lo que sí aparece es añadir a sys.path el directorio site-packages del venv, no bin. [1]
Si quieres que los paquetes estén disponibles sin gestionar manualmente la ruta del entorno virtual, el material recuperado sugiere instalarlos directamente en la ubicación de módulos Python de IRIS usando pip --target=/path/to/your/iris/mgr/python .... [1]
También se recupera una referencia a un artículo con más detalles sobre entornos virtuales y a una librería para ayudar a configurar un único venv para IRIS, pero en el contenido recuperado no se aportan más detalles técnicos que permitan confirmar una configuración global basada en IRIS_PYTHON_PATH. [1]
En resumen, la sugerencia sustentada por el material es:
- no apuntar a
.venv/bin/, sino alsite-packagesdel entorno virtual en tiempo de ejecución consys.path.append(...); o - instalar las dependencias directamente en
mgr/pythonconpip --target. [1]
Sources:
¡Buenas @Kurro Lopez ! Por mi experiencia con la versión Community, no es necesario definir los entornos virtuales de Python, si quieres, echa un vistazo a este ejemplo que está trabajando con InterSystems IRIS Community:
https://github.com/intersystems-ib/inquisidor/blob/main/iris/Dockerfile
Básicamente es esto:
RUN apt-get update && apt-get install -y python3 && apt-get -y install curl
# install required packages
COPY --chown=$ISC_PACKAGE_MGRUSER:$ISC_PACKAGE_IRISGROUP /requirements.txt /
RUN chmod 777 /requirements.txt
RUN pip3 install -r /requirements.txt --break-system-packagesComo ves, instalamos previamente python3 y a continuación ejecutamos un pip3. Si miras el docker-compose de dicho proyecto no estamos configurando ningún entorno virtual. Prueba a adaptar tu código como el de este proyecto y nos comentas.