Show HN: #!/usr/bin/env docker run

Un truco ingenioso convierte un Dockerfile en un script ejecutable mediante un shebang que invoca `docker build` y `docker run`, empaquetando en un solo archivo código, dependencias y tiempo de ejecución. Los comentaristas se dividen entre admirar la elegancia de un Dockerfile autocontenido y ejecutable, y criticarlo por ilegible, no portátil e innecesario frente a scripts Bash más simples, shebangs de Nix/Guix o herramientas de contenedores convencionales. El intercambio se amplía a un debate sobre los ecosistemas de contenedores (Docker frente a Podman, compatibilidad con Windows y macOS), el valor de los artefactos de un solo archivo y la mejor forma de empaquetar y aislar pilas de aplicaciones complejas.

Lo que hace el truco

  • Convierte un Dockerfile en un script ejecutable mediante un shebang que llama a envbashdocker build y docker run.
  • Ejecutar ./Dockerfile tanto construye como ejecuta el contenedor, en lugar de pasos separados de docker build y docker run.
  • Algunos lo ven como un ingenioso “Docker shebang” o “Dockerfile que se autoconstruye y se autoejecuta”; otros enfatizan que es sobre todo un truco simpático, no algo que deba estandarizarse en repositorios.

Un solo archivo vs varios archivos y heredocs

  • A muchos no les gustan las secciones grandes de heredoc dentro de Dockerfiles o scripts de shell, y las consideran difíciles de leer y mantener.
  • A otros les gustan los “programas completos” de un solo archivo por su fácil distribución (correo, gists, compartir rápido) y por evitar la deriva de dependencias de scripts externos.
  • Alternativas mencionadas: scripts de bash que generan archivos mediante heredocs, archivos autoextraíbles (p. ej., tarball+shell) y Markdown con bloques de código delimitados.
  • Algunos sostienen que los directorios son una unidad de empaquetado más limpia; la obsesión por un solo archivo se ve más estética que práctica.

Utilidad y casos de uso

  • Usos potenciales: enviar toda una pila o herramienta a clientes como un solo archivo, asegurando entornos consistentes; apps de demostración rápidas; “meta-seeds” con muchas dependencias.
  • Otros dicen que la complejidad y el factor sorpresa (“nivel WTF”) lo hacen inadecuado para trabajo en equipo o código de producción, donde un simple envoltorio en bash es más claro.

Mecánica del shebang y portabilidad

  • Depende de /usr/bin/env -S (split-string) para pasar múltiples argumentos en un shebang; esto es específico de GNU coreutils y relativamente reciente.
  • El comportamiento del shebang con espacios y múltiples argumentos no es estándar; POSIX deja los resultados como “no especificados”.
  • Los límites de longitud del shebang (~256 bytes) y las diferencias entre sistemas operativos se señalan como riesgos adicionales de portabilidad.

Contenedores, Docker y alternativas

  • Hay debate sobre llamar a esto “multiplataforma”: Docker necesita un kernel Linux (VM en macOS/la mayoría de Windows), aunque existen contenedores nativos de Windows.
  • Se discuten contenedores de Windows, WSL, Hyper-V; algunos dicen que el soporte para contenedores de Windows es real pero está mal promocionado.
  • Se citan Podman, CRI-O, runc/crun, bubblewrap, shebangs shell de Guix/Nix, Apptainer/Singularity y otros runtimes como enfoques más limpios o más intencionales.
  • Debate más amplio sobre contenedores vs “simplemente ejecútalo en el host”: los contenedores ayudan a aislar conjuntos complejos de dependencias; otros los consideran excesivos para proyectos personales.