Explora tiendas de imágenes adicionales en Podman

En este artículo, muestro cómo almacenar imágenes de contenedores en recursos compartidos, lo que permite acceder a las imágenes a través de la red. usaré el tiendas de imágenes adicionales funcionalidad para lograr este objetivo. Comencemos con un poco de historia.

En una publicación de blog anterior, analicé la funcionalidad de los almacenes de imágenes y cómo las imágenes de contenedores se pueden compartir en la red.

"Almacenes de imágenes adicionales es una excelente característica que le permite configurar almacenes de imágenes adicionales de solo lectura. Por ejemplo, puede configurar un recurso compartido NFS con muchas imágenes de contenedores en capas y compartirlas con todo su contenedor a través de NFS. Entonces, en lugar de requiriendo que cada nodo ejecute un motor de contenedor para obtener imágenes enormes, podrían usar la imagen en la tienda NFS e iniciar el contenedor".

Cuando agregamos esta función, esperábamos que los usuarios montaran recursos compartidos de red que contenían una gran cantidad de imágenes para usar en un contenedor. Ahora encontramos muchos más casos de uso para usarlos dentro del host.

El campo clave en el que debemos centrarnos en los archivos de configuración se llama tiendas de imágenes adicionales. El campo está en el /etc/Contenedores/Almacenamiento.conf Donde $HOME/.config/Contenedores/Almacenamiento.conf archivos. Para proporcionar más almacenes de imágenes de contenedores, agregue directorios en su sistema local o monte desde un sistema remoto en este campo.

man Contenedores-Almacenamiento.conf
…
[storage.options]
additionalimagestores=[]
Paths to additional container image stores. Usually, these are read-only and stored on remote network shares.

Consideremos esta solución usando un ejemplo concreto que incluye compartir imágenes entre múltiples usuarios.

Índice

El problema

Un reciente publicar sobre Podman repo mencionó el uso de tiendas de imágenes adicionales dominio.

"Quiero configurar un almacenamiento de imágenes compartidas de solo lectura que puedan usar varios podman. ¿Cómo puedo llevar las imágenes al almacenamiento de solo lectura?

Tengo esta línea en mi Almacenamiento.conf

tiendas de imágenes adicionales = ['/storage']

Ahora, ¿cómo debo decirle al comando podman pull que almacene la imagen en el directorio "/Almacenamiento", que quiero usar como almacenamiento compartido de solo lectura? "

Determiné que el usuario quería compartir el almacenamiento entre varios usuarios en su sistema. En otras palabras, el usuario insertaría la imagen en el host y luego permitiría que el root y otros usuarios compartieran la imagen.

La solución

Con Podman es fácil extraer imágenes a diferentes directorios de almacenamiento usando el --root opción, así que vamos a empezar con eso.

man podman
…
--root=value
Almacenamiento   root  dir  in  which  data,  including  images,  is  stored  (default: "/var/lib/Contenedores/Almacenamiento"  for  UID  0, "$HOME/.local/share/Contenedores/Almacenamiento" for other users).  Default root dir is configured in /etc/Contenedores/Almacenamiento.conf.

Para mis ejemplos, elegí compartir el /var/lib/mycontainers directorio del sistema entre los diferentes motores de contenedores.

Si quiero extraer contenido a otra carpeta, puedo ejecutar el siguiente comando de Podman:

# podman --root /var/lib/mycontainers pull fedora
Trying to pull registry.fedoraproject.org/fedora...
Getting image source signatures
Copying blob 1657ffead824 done  
Copying config eb7134a03c done  
Writing manifest to image destination
Storing signatures
eb7134a03cd6bd8a3de99c16cf174d66ad2d93724bac3307795efcd8aaf914c5

# podman --root /var/lib/mycontainers images
REPOSITORY                          TAG      IMAGE ID       CREATED       SIZE
registry.fedoraproject.org/fedora   latest   eb7134a03cd6   2 weeks ago   208 MB

Ahora puedo usar esta capacidad adicional en un contenedor (suponiendo que el contenedor esté configurado para usar tiendas adicionales). Enviamos imagen estable con Construido preconfigurado para utilizar los cargadores adicionales y aumentar la escala /var/lib/mycontainers directorio en /var/lib/shared punto de montaje Describí esta configuración en una anterior Blog.

# podman run -v /var/lib/mycontainers:/var/lib/shared:ro quay.io/buildah/stable buildah images
REPOSITORY                          TAG      IMAGE ID       CREATED       SIZE     R/O
registry.fedoraproject.org/fedora   latest   eb7134a03cd6   2 weeks ago   208 MB   true

¡Muy genial! El siguiente paso es intentar usar la tienda adicional en mi directorio de inicio.

Lo primero que debo hacer es crear un Almacenamiento.conf en mi directorio de inicio que apunta al almacenamiento compartido.

$ cat ~/.config/Contenedores/Almacenamiento.conf
[storage]
driver = "overlay"

[storage.options]
additionalimagestores = [ "/var/lib/mycontainers",]

[storage.options.overlay]
mount_program = "/usr/bin/fuse-overlayfs"

Ahora vamos a ver si podemos ver las imágenes.

$ podman images
Error: Could not get runtime: error opening "/var/lib/mycontainers/overlay-images/images.lock": permission denied

No estamos del todo allí. El problema es que el usuario no root no tiene permiso para leer el almacenamiento del propietario root. Tengo que hacer que el contenido sea legible y ejecutable por el mundo. Estableceré los permisos de esta manera:

$ sudo chmod -R a+rx /var/lib/mycontainers

Tenga en cuenta que si configura los permisos de esta manera, los contenidos de estos directorios no son secretos. Por lo general, esto no es un problema. Si las imágenes se extrajeron de registros públicos, un usuario sin root podría haberlas extraído y examinado el contenido.

Ahora que los permisos están configurados, ejecutemos el podman images ordenar de nuevo:

$ podman images
REPOSITORY                         TAG        IMAGE ID         CREATED       SIZE       R/O
registry.fedoraproject.org/fedora   latest   eb7134a03cd6   2 weeks ago   208 MB   true

¡Eso funciona!

Note que el podman images El comando agrega otra columna que indica que Podman usa imágenes de solo lectura. Si intenta eliminar estas imágenes con Podman sin root, fallará.

Si un usuario retira una imagen diferente, se almacena en su almacenamiento de lectura y escritura y puede usar ambas.

$ podman pull alpine
Trying to pull docker.io/library/alpine...
Getting image source signatures
Copying blob cbdbe7a5bc2a done  
Copying config f70734b6a2 done  
Writing manifest to image destination
Storing signatures
f70734b6a266dcb5f44c383274821207885b549b75c8e119404917a61335981a

$ podman images
REPOSITORY                                 TAG    IMAGE ID          CREATED      SIZE       R/O
registry.fedoraproject.org/fedora   latest   eb7134a03cd6  2 weeks ago   208 MB     true
docker.io/library/alpine                   latest   f70734b6a266   5 weeks ago   5.88 MB  false

Ahora ejecutemos un contenedor en esta imagen.

$ podman run registry.fedoraproject.org/fedora ls -latr /
total 12
drwxr-xr-x.   2 nobody nobody    6 Jan 28 18:30 srv
lrwxrwxrwx.   1 nobody nobody    8 Jan 28 18:30 sbin -> usr/sbin
drwxr-xr-x.   2 nobody nobody    6 Jan 28 18:30 opt
drwxr-xr-x.   2 nobody nobody    6 Jan 28 18:30 mnt
drwxr-xr-x.   2 nobody nobody    6 Jan 28 18:30 media
lrwxrwxrwx.   1 nobody nobody    9 Jan 28 18:30 lib64 -> usr/lib64
lrwxrwxrwx.   1 nobody nobody    7 Jan 28 18:30 lib -> usr/lib
drwxr-xr-x.   2 nobody nobody    6 Jan 28 18:30 home
…

Genial, pude ejecutar un contenedor sin tener que extraer la imagen. Podría configurar muchos usuarios con esta configuración, y todos podrían compartir almacenamiento. Un problema que puede haber notado es que todos los archivos de imagen son propiedad del usuario. El motivo es que Podman ejecuta el contenedor en un espacio de nombres de usuario. El usuario raíz (UID=0) no está asignado al espacio de nombres del usuario. Cualquier UID que no esté asignado en el espacio de nombres de usuario se notifica como un usuario.

Sin embargo, aún puede escribir en archivos de imagen.

$ podman run registry.fedoraproject.org/fedora bash -c "ls -ld /root;chown root:root /root; ls -ld /root"
dr-xr-xr-x. 2 nobody nobody 196 May 15 06:48 /root
dr-xr-xr-x. 2 root root 4096 May 15 06:48 /root

Los contenedores utilizan el sistema de archivos de superposición, por lo que cuando escribe en un archivo o directorio como raíz, le permite copiar el contenido en un directorio utilizado por el usuario, y será propiedad de la raíz del contenedor.

Todavía tenemos trabajo por hacer para que esta sea una buena solución funcional, porque si extraigo otra imagen de la tienda adicional, Podman restablece los permisos a ilegibles.

$ sudo podman --root /var/lib/mycontainers pull ubi8
Trying to pull registry.access.tipstecnologicos.es/ubi8...
Getting image source signatures
Copying blob 58e1deb9693d done  
Copying blob 78afc5364ad2 done  
Copying config 8e0b0194b7 done  
Writing manifest to image destination
Storing signatures
8e0b0194b7e1142c76aa26d71264d3561fab1b039fd3c49d9083dc9d3f42068f

$ podman images
Error: Could not get runtime: open /var/lib/mycontainers/overlay-images/images.json: permission denied
$ sudo chmod -R a+rx /var/lib/mycontainers/
$ podman images
REPOSITORY                                 TAG     IMAGE ID          CREATED      SIZE         R/O
registry.fedoraproject.org/fedora   latest    eb7134a03cd6   2 weeks ago  208 MB       true
docker.io/library/alpine                   latest    f70734b6a266   5 weeks ago   5.88 MB   false
registry.access.tipstecnologicos.es/ubi8    latest   8e0b0194b7e1   5 weeks ago   211 MB       true

Conclusión

Las tiendas adicionales son un concepto muy poderoso. Imagine almacenar miles de imágenes en un recurso compartido de red. Puedes compartirlo con cientos de nodos y usuarios. Todos los usuarios podrían usar las imágenes sin tener que extraerlas de cada nodo y cuenta de usuario.

Artículos de interés

Subir