# Imágenes base


Todos los Dockerfiles comienzan a partir de una imagen base. Una base es la imagen que tu imagen extiende, y hace referencia al contenido de la instrucción `FROM` en el Dockerfile.

```dockerfile
FROM debian
```

En la mayoría de los casos, no necesitas crear tu propia imagen base. Docker Hub contiene una amplia biblioteca de imágenes de Docker listas para ser usadas como base en tus compilaciones. Las [Imágenes Oficiales de Docker](/docker-hub/image-library/trusted-content/#docker-official-images) cuentan con documentación detallada, promueven las mejores prácticas y se actualizan con regularidad. También existen imágenes de [Editores Verificados por Docker](/docker-hub/image-library/trusted-content/#verified-publisher-images), creadas por socios de publicación de confianza y verificadas por Docker.

## Crear una imagen base

Si necesitas controlar por completo el contenido de tu imagen, puedes crear tu propia imagen base a partir de la distribución de Linux que elijas, o bien utilizar la base especial `FROM scratch`:

```dockerfile
FROM scratch
```

La imagen `scratch` se utiliza habitualmente para crear imágenes mínimas que contengan estrictamente lo que la aplicación necesita. Consulta [Crear una imagen base mínima utilizando scratch](#crear-una-imagen-base-minima-utilizando-scratch).

Para crear una imagen base de una distribución, puedes utilizar un sistema de archivos raíz empaquetado como un archivo `tar` e importarlo a Docker con `docker import`. El proceso para crear tu propia imagen base depende de la distribución de Linux que quieras empaquetar. Consulta [Crear una imagen completa utilizando tar](#crear-una-imagen-completa-utilizando-tar).

## Crear una imagen base mínima utilizando scratch

La imagen reservada y mínima `scratch` sirve como punto de partida para compilar contenedores. Utilizar la imagen `scratch` indica al proceso de compilación que deseas que el siguiente comando del `Dockerfile` sea la primera capa del sistema de archivos en tu imagen.

Aunque `scratch` aparece en el [repositorio de Docker en Docker Hub](https://hub.docker.com/_/scratch), no puedes descargarla (pull), ejecutarla ni etiquetar (tag) ninguna imagen con el nombre `scratch`. En su lugar, simplemente haces referencia a ella en tu `Dockerfile`. Por ejemplo, para crear un contenedor mínimo utilizando `scratch`:

```dockerfile
# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]
```

Asumiendo que existe un ejecutable binario llamado `hello` en la raíz del [contexto de compilación](/build/concepts/context/). Puedes compilar esta imagen de Docker utilizando el siguiente comando `docker build`:

```console
$ docker build --tag hello .
```

Para ejecutar tu nueva imagen, utiliza el comando `docker run`:

```console
$ docker run --rm hello
```

Esta imagen de ejemplo solo se ejecutará con éxito si el binario `hello` no tiene dependencias en tiempo de ejecución. Los programas informáticos suelen depender de otros programas o recursos para existir en el entorno de ejecución. Por ejemplo:

- Entornos de ejecución de lenguajes de programación (runtimes)
- Bibliotecas C enlazadas dinámicamente
- Certificados CA

Al crear una imagen base, o cualquier otra imagen, este es un aspecto muy importante a considerar. Es por eso que crear una imagen base utilizando `FROM scratch` puede ser difícil para cualquier programa que no sea pequeño y sencillo. Por otra parte, también es importante incluir solo lo necesario en tu imagen para reducir su tamaño y la superficie de ataque.

## Crear una imagen completa utilizando tar

En general, debes comenzar con una máquina en funcionamiento que ejecute la distribución que te gustaría empaquetar como imagen base, aunque esto no es un requisito para herramientas como [Debootstrap](https://wiki.debian.org/Debootstrap) de Debian, la cual también puedes usar para compilar imágenes de Ubuntu.

Por ejemplo, para crear una imagen base de Ubuntu:

```dockerfile
$ sudo debootstrap noble noble > /dev/null
$ sudo tar -C noble -c . | docker import - noble

sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3

$ docker run noble cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS"
```

Puedes encontrar más scripts de ejemplo para crear imágenes base en [el repositorio de GitHub de Moby](https://github.com/moby/moby/blob/master/contrib).

## Más recursos

Para obtener más información sobre la compilación de imágenes y la escritura de Dockerfiles, consulta:

- [Referencia de Dockerfile](/reference/dockerfile/)
- [Mejores prácticas de Dockerfile](/build/building/best-practices/)
- [Imágenes Oficiales de Docker](/docker-hub/image-library/trusted-content/#docker-official-images)

