Estoy buscando empaquetar una gran cantidad de código fuente local y abierto en un contenedor acoplable que se distribuirá a las máquinas host para su compilación y ejecución. La intención del contenedor final es ejecutar el estilo de línea de comando y generar el resultado, por ejemplo. ( docker run cmdcontainer args
). El problema que tengo es que la fuente que se distribuye debe apuntarse y compilarse en el host específico en el que se ejecutará una vez y esto lleva horas en completarse. Sin embargo, una vez compilado, el comando se ejecuta muy rápido.
Entonces me pregunto si existe un patrón de ventana acoplable conocido para este tipo de flujo de trabajo:
Distribuya Docker Container con archivos fuente -> Ejecute el contenedor para generar un nuevo contenedor con binarios compilados -> Las ejecuciones posteriores ejecutan el contenedor compilado
Debido a que esto es básicamente colocar un contenedor nuevo encima del anterior, parece que esto debería ser posible, pero soy un novato en Docker.
Respuesta1
Dado que cada host es único, la mejor solución que se me ocurrió fue usar un volumen para la persistencia. Necesitaría el siguiente flujo de trabajo en su punto de entrada:
- Verifique la versión de su código compilado en el volumen.
- Si la versión no coincide, elimine el contenido del volumen.
- Si la versión no está configurada o no coincide, ejecute su compilación
- Escriba el nuevo número de versión en ese volumen.
- Ejecute su aplicación desde la versión compilada en el volumen
Esto requiere que la compilación de su imagen incorpore un número de versión, por ejemplo, un hash de git. Puedes hacer esto con un argumento de compilación:
docker build --build-arg GIT_REV=$(git rev-parse --short HEAD) ...
Y luego tu Dockerfile incluiría algo como:
ARG GIT_REV
ENV GIT_REV=${GIT_REV}
Tenga en cuenta que cualquier usuario que ejecute sin un volumen seguirá viendo cada ejecución realizar la compilación.