Di Dockerfile, saya punya
COPY . .
Saya ingin mengecualikan seluruh direktori, dalam kasus saya, direktori node_modules.
Sesuatu seperti ini:
COPY [all but **/node_modules/**] .
Apakah ini mungkin dengan Docker?
Di Dockerfile, saya punya
COPY . .
Saya ingin mengecualikan seluruh direktori, dalam kasus saya, direktori node_modules.
Sesuatu seperti ini:
COPY [all but **/node_modules/**] .
Apakah ini mungkin dengan Docker?
Jawaban:
Buat file .dockerignore
di direktori konteks bangunan buruh pelabuhan Anda (jadi dalam kasus ini, kemungkinan besar direktori yang merupakan induk dari node_modules) dengan satu baris di dalamnya:
**/node_modules
walaupun Anda mungkin hanya ingin:
node_modules
Info tentang dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
/config/nginx/ /config/logstash/
ls config/ gunicorn logs logstash nginx
ls /config/
, apakah Anda mencoba menambahkan path tersebut ke .dockerignore Anda tanpa yang terdepan /
?
node_modules
saja tidak bekerja di subdirektori.
Bagi mereka yang tidak dapat menggunakan file .dockerignore (mis. Jika Anda memerlukan file dalam satu COPY tetapi tidak yang lain):
Ya, tetapi Anda memerlukan beberapa instruksi COPY. Khususnya, Anda memerlukan SALINAN untuk setiap huruf dalam nama file yang ingin Anda kecualikan.
COPY [^n]* # All files that don't start with 'n'
COPY n[^o]* # All files that start with 'n', but not 'no'
COPY no[^d]* # All files that start with 'no', but not 'nod'
Melanjutkan hingga Anda memiliki nama file lengkap, atau hanya awalan yang Anda yakini tidak akan memiliki file lain.
COPY failed: no source files were specified
ketika tidak ada file dimulai dengan 'tidak', tetapi tidak 'mengangguk'.
src/
akan pergi ke /var/www
dan /conf/nginx.conf
pergi ke /etc/nginx/conf.d/default.conf
. Juga, Anda bisa menyalin semuanya, dan RUN rm -r conf
kemudian (juga menjaga pohon sumbernya seperti semula). Saya ingin mendengar jika seseorang memiliki saran lain.
COPY [^node_modules]*
untuk menyalin semua file tingkat atas.
Dalam kasus saya, Dockerfile saya berisi langkah instalasi, yang menghasilkan vendor
direktori (setara dengan PHP node_modules
). Saya kemudian COPY
direktori ini ke gambar aplikasi akhir. Oleh karena itu, aku tidak bisa meletakkan vendor
di saya .dockerignore
. Solusi saya adalah menghapus direktori sebelum melakukan composer install
(setara dengan PHP npm install
).
FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
&& composer install
FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .
Solusi ini berfungsi dan tidak mengasapi gambar akhir, tetapi tidak ideal, karena vendor
direktori pada host disalin ke dalam konteks Docker selama proses pembangunan, yang menambah waktu.
composer.lock
sebelumnya composer install
. Tanpa file kunci, satu set dependensi berbeda (folder vendor) dapat diinstal ketika Anda membangun di waktu berikutnya.
Menambahkan .dockerignore berfungsi untuk saya. Satu poin tambahan Mereka yang mencoba solusi ini di Windows , windows tidak akan membiarkan Anda membuat file .dockerignore (karena tidak secara default memungkinkan membuat file dimulai dengan.)
Untuk membuat file seperti itu dimulai dengan. pada Windows , sertakan juga titik akhir, seperti: .dockerignore.
dan tekan enter (asalkan Anda telah mengaktifkan opsi ekstensi tampilan dari opsi folder)
Tidak termasuk node_modules dari direktori saat ini
node_modules
Tidak termasuk node_modules dalam subdirektori langsung apa pun
*/node_modules
Ini dokumen resmi
.dockerignore
?