Dockerignore: ignora tutto tranne un file e il Dockerfile


92

Quindi l'intenzione principale era quella di dockerizzare un'applicazione fat jar e metterla in Elasticbeanstalk. Il problema è con il contesto. È un po 'stupido aggiungere così tanto contesto nella finestra mobile se tutto ciò di cui ho bisogno è in realtà un singolo file jar.

Ho giocato con il file .dockerignore, ma mi sono perso. Ho provato a usare la negazione gitignore, ma non funziona.

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

C'è anche quella cosa con regex, ma sembra che le espressioni regolari complicate non siano supportate.

^((?!Dockerfile).)*$

Ho anche provato a cercare in stackoverflow e questi due sono tutto ciò che ho trovato:

Questa domanda potrebbe essere simile alla seconda, ma penso che sia leggermente diversa poiché qui, voglio solo includere un singolo file nel contesto.

Qualsiasi aiuto sarà apprezzato.


Il punto esclamativo per le cartelle funziona per me!
Ivan Aracki

Risposte:


135

Se è necessario ignorare tutto tranne alcune directory o file e ignorare anche alcuni file non necessari all'interno di quelle directory consentite, è possibile utilizzare il seguente .dockerignorefile:

# 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

8
Secondo la documentazione di Docker dovrebbe essere sufficiente mettere solo *sulla prima riga (invece di **). Quote: "potresti voler specificare quali file includere nel contesto, piuttosto che quali escludere. Per ottenere ciò, specifica *come primo modello, seguito da uno o più !modelli di eccezione".
Johnny Thunderman,

32

Dal riferimento dockerfile :

Oltre alle regole filepath.Match di Go, Docker supporta anche una speciale stringa di caratteri jolly ** che corrisponde a qualsiasi numero di directory (compreso lo zero). Ad esempio, ** / *. Go escluderà tutti i file che terminano con .go che si trovano in tutte le directory, inclusa la radice del contesto di compilazione.

Quindi una riga contenente semplicemente ** ignorerà tutto nella stessa directory del Dockerfile.

Come previsto, il punto esclamativo può quindi essere utilizzato per fare riferimento a qualsiasi file che si desidera inviare al daemon docker.


3
È estremamente importante che **vada all'inizio del file, altrimenti le esclusioni verranno ignorate. Docker utilizza l'ultima regola che corrisponde come regola "finale", quindi se **è ultima corrisponderà a tutto.
tedivm

3
Quindi aggiungi **sulla prima riga e !foosulla riga successiva se fooè l'unico file che desideri includere.
Saca

9

Può sembrare strano, ma se tutto ciò di cui hai bisogno è un singolo file jar, potresti creare una cartella "docker" nel tuo sistema di compilazione che contiene il tuo Dockerfile. Quando esegui le tue build, fai in modo che gli script di build copino il singolo file jar in "docker", quindi esegui la build dell'immagine docker (dall'interno della cartella "docker") e invia al tuo registro docker quando hai finito.


2
Ciao, non suona affatto strano. Pensavo fosse una pratica generale, ma stavo cercando un modo per farlo con .dockerignore se possibile. Inoltre, non mi piace molto mvn xml :)
Rowanto

È possibile combinare entrambi gli approcci inserendo il dockerfile in una sottodirectory e utilizzare .dockerignore. Secondo i documenti, è bene farlo comunque
Jonathan Lee

Documentazione di Docker : nella maggior parte dei casi, è meglio iniziare con una directory vuota come contesto e mantenere il Dockerfile in quella directory. Aggiungi solo i file necessari per la creazione del Dockerfile. Avvertenza: non utilizzare la directory principale, /, come PATH poiché causa il trasferimento dell'intero contenuto del disco rigido al daemon Docker da parte della build.
Jonathan Lee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.