Dockerignore: ignore todo excepto un archivo y el Dockerfile

89

Entonces, la intención principal era dockerizar una aplicación fat jar y ponerla en Elasticbeanstalk. El problema está en el contexto. Es un poco estúpido agregar tanto contexto en la ventana acoplable si todo lo que necesito es en realidad un solo archivo jar.

He estado jugando con el archivo .dockerignore, pero estoy perdido. Traté de usar la negación gitignore, pero no funciona.

*
!Dockerfile
*/
!target/
target/*
!target/*.jar

También existe esa cosa con las expresiones regulares, pero parece que las expresiones regulares complicadas no son compatibles.

^((?!Dockerfile).)*$

También intenté buscar en stackoverflow, y estos dos son todo lo que encontré:

Esta pregunta puede ser similar a la segunda, pero creo que es ligeramente diferente ya que aquí, solo quiero incluir un solo archivo en el contexto.

Se agradecerá cualquier ayuda.

Rowanto
fuente
¡El signo de exclamación para carpetas me funciona!
Ivan Aracki

Respuestas:

127

Si necesita ignorar todo excepto algunos directorios o archivos y también ignorar algunos archivos innecesarios dentro de esos directorios permitidos, puede usar el siguiente .dockerignorearchivo:

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db
Mauricio Sánchez
fuente
8
Según la documentación de Docker , debería ser suficiente colocar solo *en la primera línea (en lugar de **). Cita: "es posible que desee especificar qué archivos incluir en el contexto, en lugar de cuáles excluir. Para lograr esto, especifique *como primer patrón, seguido de uno o más !patrones de excepción".
Johnny Thunderman
31

De la referencia de dockerfile :

Más allá de las reglas de la ruta de archivo de Go, Docker también admite una cadena comodín especial ** que coincide con cualquier número de directorios (incluido el cero). Por ejemplo, ** / *. Go excluirá todos los archivos que terminan en .go que se encuentran en todos los directorios, incluida la raíz del contexto de compilación.

Entonces, una línea que contenga simplemente ** ignorará todo en el mismo directorio que el Dockerfile.

Como se esperaba, la exclamación se puede usar para hacer referencia a cualquier archivo que desee enviar al demonio de la ventana acoplable.

abrazar
fuente
3
Es extremadamente importante que **vaya al principio del archivo, de lo contrario se ignorarán las exclusiones. Docker usa la última regla que coincide como la regla "final", por lo que si **es la última, coincidirá con todo.
tedivm
3
Así que agregue **en la primera línea y !fooen la siguiente línea si fooes el único archivo que desea incluir.
Saca
9

Esto puede sonar extraño, pero si todo lo que necesita es un solo archivo jar, puede crear una carpeta "docker" en su sistema de compilación que contenga su Dockerfile. Cuando ejecute sus compilaciones, haga que los scripts de compilación copien el archivo jar único en "docker", luego ejecute la compilación de la imagen de la ventana acoplable (desde dentro de la carpeta "docker") y empuje a su registro de la ventana acoplable cuando haya terminado.

Jay Atkinson
fuente
2
Hola, no suena extraño en absoluto. Pensé que era una práctica general, pero estaba buscando una manera de hacerlo con el .dockerignore si era posible. Además, realmente no me gusta mvn xml :)
Rowanto
Puede combinar ambos enfoques poniendo el dockerfile en un subdirectorio y usando .dockerignore. De acuerdo con los documentos, es bueno hacerlo de todos modos
Jonathan Lee
Documentación de Docker : en la mayoría de los casos, es mejor comenzar con un directorio vacío como contexto y mantener su Dockerfile en ese directorio. Agregue solo los archivos necesarios para compilar el Dockerfile. Advertencia: No utilice su directorio raíz, /, como PATH, ya que hace que la compilación transfiera todo el contenido de su disco duro al demonio Docker.
Jonathan Lee