Post

Docker para ISIS Image Subtraction p.2: Imagen y Contenedor

Docker para ISIS Image Subtraction p.2: Imagen y Contenedor

No te corre el ./process.csh ?

Esto es un intento de comunicar mi bitácora

  • desde IA-UNAM Ensenada.

AVISO ⚠️🚨⚠️: Puede parecer abrumador pero es un procedimiento de una sola vez, prometo que al final de la entrada tendrás una rutina bastante ágil.

Notas:

  • 🍂 En Linux Mint 21.3 Cinnamon, pero no debería cambiar mucho en otras distribuciones.
  • 🌌 Se asume que ya cuentas con IRAF en tu equipo en algunas ocasiones, aunque puedes prescindir de él.

🐋 Instalación de Docker

Sigue el tutorial con la propia documentación de Docker

🔴 Si te sale un error al hacer el build del tipo:

ERROR: permission denied while trying to connect to the Docker daemon socket at unix

Puedes probar con la siguiente solución:

1
sudo chmod 777 /var/run/docker.sock

Una vez que hayas concluído el tutorial, puedes comprobar la instalación ejecutando la imagen hello-world:

1
sudo docker run hello-world

No deberías obtener errores.

En caso de error recurrente

En uno de los equipos que estuve utilizando se me presentaba el error mencionado anteriormente cada vez que intentaba usar docker.

En ese caso cree un archivo docker_permisos.csh que ejecutaba como: bash docker_permisos.csh al principio de cada sesión:

1
2
#! /bin/csh -f
sudo chmod 777 /var/run/docker.sock

🧑🏾‍💻 Construcción de nuestro entorno de trabajo

A este punto ya deberías tener tu archivo ISIS2.2.tar, descargado desde la pagina oficial.

1. 🗃️ Estructura de directorios en tu host

Nos vamos a colocar en nuestro entorno de trabajo, recomiendo que sea en la carpeta ~/iraf / ~/.iraf para que puedas usar ambos paquetes de manera complementaria.

Entonces crearemos dos directorios:

  • isis_workspace: Aquí van a ir nuestros archivos Dockerfile (lo construiremos a continuación) e ISIS2.2.tar
  • isis_host: Aquí es donde vamos a interactuar con el paquete ISIS
1
2
3
4
mkdir isis_workspace
cd isis_workspace # aqui se debe encontrar el ISIS2.2.tar
mkdir isis_host  # Aquí verás los archivos de ISIS desde el host
cp ISIS2.2.tar isis_host/ # Hacemos una copia del ISIS2.2.tar en el isis_host

2. 🐳 Dockerfile

Creamos nuestro archivo Dockerfile en isis_workspace:

1
touch Dockerfile

Usaremos la imagen oficial de CentOS 6, una distribución lo suficientemente antigua para que no se presenten errores de compatibilidad con ISIS. Se nos presenta la desventaja de que CentOS 6 ya no cuenta con mantenimiento, es por eso que, en procedimientos que lo requieran (como aquellos con Python o con IRAF/DS9) podremos manipular los datos desde el host. Ahí radica la principal ventaja de que usemos volumenes.

Accedemos al Dockerfile y escribimos lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Dockerfile para configuración de ISIS en CentOS 6
# Nota: Este sistema utiliza una versión antigua de CentOS para su compatibilidad con ISIS

# Utiliza la imagen oficial de CentOS 6
FROM centos:6

# Reemplaza los repositorios de CentOS 6 por los repos archivados (ya no existen de la manera usual)
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \
    sed -i 's|^#baseurl=http://mirror.centos.org/centos/$releasever|baseurl=http://vault.centos.org/6.10|g' /etc/yum.repos.d/CentOS-Base.repo

# Instala paquetes y herramientas necesarias para nuestro flujo
RUN yum install -y \
    tcsh \
    nano \
    glibc.i686 \
    vim \
    awk \
    emacs && \
    yum update -y && \
    yum groupinstall -y "Development Tools" && \
    yum install -y \
    wget \
    csh

# Configuración del entorno ISIS
WORKDIR /isis
COPY ISIS2.2.tar /isis/

# Extracción del paquete ISIS
RUN chown -R root:root /isis

# Variables de entorno críticas (no modificar)
ENV PATH="/isis/package/bin:/isis/package/register:$PATH"

# Comando por defecto (shell interactiva)
CMD ["/bin/bash"]

A este punto, la estructura de tus directorios debería verse así:

isis_workspace_tree

3. 👷🏾‍♀️ BUILD: Primera ejecución

En el mismo directorio isis_workspace donde se deben encontrar el Dockerfile e ISIS2.2.tar vamos a construir la imagen con los siguientes comandos:

  • Nombraremos a nuestra imagen: isis_env_image
1
2
3
4
docker build -t isis_env_image . 

# para comprobar: 
docker images # despliega una lista de nuestras imagenes

Ya tenemos nuestra imagen, a partir de esta es de donde vamos a poder crear contenedores con el comando run.

La forma mas simple de crear un contenedor a partir de nuestra imagen es la siguiente (mas adelante explicaremos por que no es la recomendada para nuestro flujo):

🏃🏾‍♂️ Ejecutar (sin volumen) 🙅🏽‍♀️❌

1
docker run -it isis_env_image /bin/bash

Esto creará un contenedor de acuerdo a las instrucciones que indicamos en el Dockerfile, al cual podremos acceder para trabajar dentro de su entorno.

La cosa con esto es que los archivos generados dentro del contenedor no se encontrarán disponibles tan facil desde nuestro entorno local. Incluso, añadir archivos al entorno requiere el mismo nivel de molestia, lo cual es de especial preocupación si nuestro flujo de trabajo requiere la manipulación de distintos grupos de imagenes, que necesitaremos visualizar y procesar con IRAF en distintas partes del proceso.

Una solucion algo tediosa (que es lo que yo solía hacer al principio) implica copiar archivos hacia y desde el directorio con el comando cp de docker, algo parecido al de bash.

1
docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Sin embargo, hay una manera de garantizar que los archivos existan y sean accesibles de forma local y en el contenedor, de forma que cada cambio en uno sea visible inmediatamente en el otro. Esto se logra mediante Volumenes.

🧑🏾‍💻🤝🏽🐳 Volumen

🏃🏾‍♂️ Ejecutar (en volumen) 😎✅

1
docker run -it --name isis_local_env -v $(pwd)/isis_host:/isis isis_env_image /bin/bash

Esta acción:

  • crea un contenedor llamado isis_local_env
  • convierte nuestro directorio local isis_host, al host local del contenedor
  • Todo el contenido de /isis estará en nuestro host dentro de isis_host.
  • hace todo esto a partir de la imagen isis_env_image

Recapitulando: isis_host e isis/ comparten contenido, en local y en el contenedor respectivamente.

A este punto ya es altamente recomendable que trabajes con dos ventanas de la terminal. Una en el contenedor y otra en el host local.

🏗️ ISIS en el Volume

Si ya te encuentras en /isis notarás que únicamente contiene el archivo ISIS2.2.tar, hace falta extraerlo y realizar la instalación. La extracción la puedes hacer ya sea desde el host o desde el container:

Extraemos:

1
tar -xvf ISIS2.2.tar # Unpack

Es muy importante que la instalación la hagamos desde el contenedor /isis:

1
2
cd package 
yes | csh install.csh

✔️ Permisos

Puede que te encuentres con un problema de permisos al intentar modificar o acceder a un archivo desde del host local, esto se soluciona con el siguiente comando:

1
2
# desde el isis_host:
sudo chmod -R a+rwx .
  • Este tipo de avisos puede aparecer varias veces, pero siempre se soluciona con el comando anterior.

✨💼 Comandos y flujo de trabajo en el día a día

La mayoria de pasos descritos anteriormente solo se necesitan realizar una vez. Ya que tengas tu imagen y tu contenedor, unicamente sera necesario acceder a el para seguir trabajando.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# listar los contenedores activos 
docker ps
# listar todos los contenedores
docker ps -a 

# iniciar un contenedor 
docker start <nombre_contenedor> 

# acceder a un contenedor en ejecucion	
docker exec -it <contenedor_id> /bin/bash

# salir del contenedor 
exit 

#detener el contenedor
docker stop <nombre_contenedor> 

Alias 🏷️🥷🏿

Al usar los mismos comandos de forma recurrente, puede ser mas comodo definir un alias para agilizar las rutinas.

En mi caso definí uno para inicializar ISIS y otro para inicializar IRAF.

Esto se hace desde terminal como sigue:

1
2
3
4
5
6
7
8
9
10
11
# Para ISIS
alias isis_up='chmod 777 /var/run/docker.sock
docker ps -a 
docker start isis_local_env
docker exec -it isis_local_env /bin/bash'

# Para IRAF
alias iraf_up='xed /home/astro/iraf/max_comandos &
source activate iraf27
ds9 -mode none -geo 760x760+2000+1000 -zscale -log -cmap grey -cmap invert yes -regions show no -mode none &
pyraf'

De modo que mi rutina diaria con ISIS e IRAF se resume así:

1
2
3
4
5
6
7
8
9
10
11
# en una terminal
bash docker_permisos.csh
isis_up

# en otra terminal 
iraf_up


# al terminar
exit # en el contenedor
docker stop isis_local_env # ya fuera

Resultado:

  • Todo el contenido de /isis (incluyendo package, binarios y demás) estará en tu host dentro de isis_host.
  • Los cambios que hagas dentro o fuera del contenedor estarán sincronizados.
  • No vas a perder nada al hacer exit.

Que podemos hacer desde el contenedor?

  • ✅ Sí corre el ./install.
  • ✅ Sí corre el ./process.csh y el resto de instrucciones .csh sin ningun problema.
  • ✅ Sí se pueden abrir en el el host los .fits generados en el contenedor.
This post is licensed under CC BY 4.0 by the author.

Trending Tags