Dockerignore: Abaikan semuanya kecuali file dan Dockerfile

92

Jadi tujuan utamanya adalah untuk merakit aplikasi botol lemak dan memasukkannya ke dalam Elasticbeanstalk. Masalahnya ada pada konteksnya. Agak bodoh untuk menambahkan begitu banyak konteks ke buruh pelabuhan jika yang saya butuhkan sebenarnya adalah satu file jar.

Saya telah bermain-main dengan file .dockerignore, tapi saya tersesat. Saya mencoba menggunakan negasi gitignore, tetapi tidak berhasil.

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

Ada juga yang namanya regex, tapi sepertinya regex yang rumit tidak didukung.

^((?!Dockerfile).)*$

Saya juga mencoba mencari di stackoverflow, dan hanya dua yang saya temukan ini:

Pertanyaan ini mungkin mirip dengan yang kedua, tapi menurut saya ini sedikit berbeda karena di sini, saya hanya ingin memasukkan satu file ke dalam konteks.

Bantuan apa pun akan dihargai.

Rowanto
sumber
Tanda seru untuk folder berhasil untuk saya!
Ivan Aracki

Jawaban:

135

Jika Anda perlu mengabaikan semuanya kecuali beberapa direktori atau file dan juga mengabaikan beberapa file yang tidak perlu di dalam direktori yang diizinkan, Anda dapat menggunakan .dockerignorefile berikut :

# 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
sumber
8
Menurut dokumentasi Docker, itu harus cukup untuk diletakkan hanya *di baris pertama (bukan **). Kutipan: "Anda mungkin ingin menentukan file mana yang akan disertakan dalam konteks, daripada yang akan dikecualikan. Untuk mencapai ini, tentukan *sebagai pola pertama, diikuti dengan satu atau beberapa !pola pengecualian".
Johnny Thunderman
32

Dari referensi dockerfile :

Di luar jalur file Go. Cocokkan aturan, Docker juga mendukung string wildcard khusus ** yang cocok dengan sejumlah direktori (termasuk nol). Misalnya, ** / *. Go akan mengecualikan semua file yang diakhiri dengan .go yang ditemukan di semua direktori, termasuk root konteks build.

Jadi baris yang berisi ** akan mengabaikan semua yang ada di direktori yang sama dengan Dockerfile.

Seperti yang diharapkan, tanda seru kemudian dapat digunakan untuk mereferensikan file apa pun yang ingin Anda kirim ke daemon buruh pelabuhan.

abraund
sumber
3
Sangat penting bahwa **pergi ke bagian atas file, jika tidak, pengecualian akan diabaikan. Docker menggunakan aturan terakhir yang cocok sebagai aturan "terakhir", jadi jika **yang terakhir akan cocok dengan semuanya.
tedivm
3
Jadi tambahkan **di baris pertama dan !foodi baris berikutnya jika foosatu-satunya file yang ingin Anda sertakan.
Saca
9

Ini mungkin terdengar aneh, tetapi jika yang Anda butuhkan hanyalah satu file jar, Anda dapat membuat folder "buruh pelabuhan" di sistem build Anda yang berisi Dockerfile Anda. Saat Anda menjalankan build, minta skrip build menyalin file jar tunggal ke "buruh pelabuhan" lalu jalankan build image buruh pelabuhan (dari dalam folder "buruh pelabuhan") dan dorong ke registri buruh pelabuhan Anda setelah selesai.

Jay Atkinson
sumber
2
Hai, itu tidak terdengar aneh sama sekali. Saya pikir itu adalah praktik umum, tetapi saya sedang mencari cara untuk melakukannya dengan .dockerignore jika memungkinkan. Selain itu, saya tidak terlalu suka mvn xml :)
Rowanto
Anda dapat menggabungkan kedua pendekatan tersebut dengan meletakkan dockerfile dalam subdirektori dan menggunakan .dockerignore. Menurut dokumen, itu baik untuk melakukannya
Jonathan Lee
Dokumentasi Docker : Dalam banyak kasus, yang terbaik adalah memulai dengan direktori kosong sebagai konteks dan menyimpan Dockerfile Anda di direktori itu. Tambahkan hanya file yang diperlukan untuk membangun Dockerfile. Peringatan: Jangan gunakan direktori root Anda, /, sebagai PATH karena ini menyebabkan build untuk mentransfer seluruh konten hard drive Anda ke daemon Docker.
Jonathan Lee