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
# 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
# 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
# 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
# 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
# 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
# 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
: