9.5. Creación de imágenes desde cero con Buildah
En lugar de comenzar con una imagen base, puede crear un nuevo contenedor que no tenga contenido y sólo una pequeña cantidad de metadatos del contenedor. Esto se conoce como un contenedor scratch
. Aquí hay algunos aspectos a tener en cuenta cuando se opta por crear una imagen partiendo de un contenedor base con el comando buildah
:
- Cuando se construye un contenedor scratch se pueden copiar ejecutables sin dependencias en la imagen scratch y hacer unos pocos ajustes de configuración para que funcione un contenedor mínimo.
-
Para utilizar herramientas como
yum
orpm
paquetes para poblar el contenedor scratch, es necesario al menos inicializar una base de datos RPM en el contenedor y añadir un paquete de liberación. El ejemplo siguiente muestra cómo hacerlo. -
Si acaba añadiendo muchos paquetes RPM, considere la posibilidad de utilizar las imágenes base de
ubi
oubi-minimal
en lugar de una imagen de cero. Estas imágenes base han sido recortadas en cuanto a documentación, paquetes de idiomas y otros componentes, lo que puede hacer que tu imagen sea más pequeña.
Este ejemplo añade un servicio web (httpd) a un contenedor y lo configura para que se ejecute. Para empezar, crea un contenedor de cero:
# buildah from scratch working-container
Esto crea sólo un contenedor vacío (sin imagen) que puede montar de la siguiente manera:
# scratchmnt=$(buildah mount working-container) # echo $scratchmnt /var/lib/containers/storage/devicemapper/mnt/cc92011e9a2b077d03a97c0809f1f3e7fef0f29bdc6ab5e86b85430ec77b2bf6/rootfs
Inicialice una base de datos RPM dentro de la imagen scratch y añada el paquete redhat-release (que incluye otros archivos necesarios para que los RPM funcionen):
# yum install -y --releasever=8 --installroot=$scratchmnt redhat-release
Instale el servicio httpd en el directorio scratch:
# yum install -y --setopt=reposdir=/etc/yum.repos.d \ --installroot=$scratchmnt \ --setopt=cachedir=/var/cache/dnf httpd
Añade algún texto a un archivo index.html en el contenedor, para poder probarlo más tarde:
# echo \ "Su contenedor httpd desde cero funcionó.\N- > $scratchmnt/var/www/html/index.html
En lugar de ejecutar httpd como un servicio init, establezca algunas opciones de buildah config
para ejecutar el demonio httpd directamente desde el contenedor:
# buildah config --cmd "/usr/sbin/httpd -DFOREGROUND" working-container # buildah config --port 80/tcp working-container # buildah commit working-container localhost/myhttpd:latest
Por ahora, puede utilizar el ID de la imagen para ejecutar la nueva imagen como un contenedor con el comando podman
:
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/myhttpd latest 47c0795d7b0e 9 minutes ago 665.6 MB # podman run -p 8080:80 -d --name httpd-server 47c0795d7b0e # curl localhost:8080 Your httpd container from scratch worked.