Ejecutar comando en el host durante la compilación de docker


¿Es posible crear Dockerfile que ejecute un comando en el host cuando se está compilando la imagen?

Ahora estoy haciendo:

./script_that_creates_magic_file.sh
docker build .

Con Dockerfile:

FROM alpine
COPY magic_file

Quiero ser capaz de hacer:

docker build .

Con Dockerfile:

FROM alpine
# invoke script_that_creates_magic_file.sh on the host
COPY magic_file

Por supuesto, este script está en el mismo directorio que Dockerfile.

Author: Piotr Aleksander Chmielowski, 2017-03-11

2 answers

(Solo una sugerencia)

Normalmente tenemos la siguiente estructura para construir nuestras imágenes docker:

my-image/
├── assets
│   ├── entrypoint.sh
│   └── install.sh
├── build.sh
├── Dockerfile
├── README.md
└── VERSION
  • build.sh : Esto es donde deberías invocar script_that_creates_magic_file.sh. Otras tareas comunes incluyen descargar archivos requeridos o copiar temporalmente claves ssh desde el host. Finalmente, este script llamará a docker build .
  • Dockerfile : Como de costumbre, pero dependiendo del número de comandos que necesitamos ejecutar, podríamos tener un install.sh
  • install.sh : Esto se copia y se ejecuta dentro del contenedor, instala paquetes, elimina archivos innecesarios, etc. Sin estar 100% seguro-creo que este enfoque reduce el número de capas evitando múltiples comandos en un solo RUN
  • entrypoint.sh : Punto de entrada del contenedor. Nos permite realizar tareas cuando se inicia el contenedor (como analizar variables de entorno) e imprimir información de depuración

Encuentro la estructura anterior conveniente y auto-documentada ya que todos en el el equipo puede construir cualquier imagen (sin instrucciones/pasos especiales). El README está ahí para explicar lo que está haciendo la imagen... pero no te mentiré... normalmente está vacío... (o tiene un h1 para que el gitlab muestre):)

 20
Author: urban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-12 23:53:21

Para responder a la pregunta; no no hay ninguna funcionalidad incorporada para ejecutar un comando en el host antes de docker build (es decir, no hay "hooks" para activar scripts en el host).

Si proporciona más información sobre su caso de uso, posiblemente haya alternativas (por ejemplo, utilizando una combinación de --build-arg y docker compose)

 4
Author: thaJeztah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-12 23:20:51