Di dalam Dockerfiles saya, saya ingin MENYALIN file ke dalam image saya jika ada, file requirement.txt untuk pip sepertinya merupakan kandidat yang baik, tetapi bagaimana ini bisa dicapai?
COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
atau
if test -e requirements.txt; then
COPY requiements.txt /destination;
fi
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
docker
dockerfile
derrend
sumber
sumber
Jawaban:
Ini saat ini tidak didukung (karena saya menduga itu akan mengarah ke gambar yang tidak dapat direproduksi, karena Dockerfile yang sama akan menyalin atau tidak file, tergantung pada keberadaannya).
Ini masih diminta, di edisi 13045 , menggunakan karakter pengganti: "
COPY foo/* bar/" not work if no file in foo
" (Mei 2015).Ini tidak akan diterapkan untuk saat ini (Juli 2015) di Docker, tetapi alat build lain seperti bocker dapat mendukung ini.
sumber
dev
berjalan dengan server dev webpack, danprod
lingkungan yang setara bekerja dengan/dist
folder statis? Ini adalah kasus di sebagian besar penyiapan front-end hari ini, dan jelasdev
danprod
tidak bisa sama di sini. Jadi bagaimana mengatasinya?Berikut ini solusi sederhana:
Pastikan
foo
ada, karenaCOPY
membutuhkan setidaknya satu sumber yang valid.Jika
file-which-may-exist
ada, itu juga akan disalin.CATATAN: Anda harus berhati-hati untuk memastikan bahwa wildcard Anda tidak mengambil file lain yang tidak ingin Anda salin. Untuk lebih berhati-hati, Anda bisa menggunakan
file-which-may-exist?
sebagai gantinya (?
hanya cocok dengan satu karakter).Atau bahkan lebih baik, gunakan kelas karakter seperti ini untuk memastikan bahwa hanya satu file yang dapat dicocokkan:
sumber
COPY --from=docker /usr/bin/docker /usr/lib/libltdl.so* /tmp/docker/
RUN mv /tmp/docker/docker /usr/bin/docker
RUN mv /tmp/docker/libltdl.so.7 /usr/lib/libltdl.so.7 || true
(di mana perpustakaan bersama adalah entitas yang tidak diketahui.)Seperti yang dinyatakan oleh komentar ini , jawaban Santhosh Hirekerur masih menyalin file, untuk mengarsipkan salinan bersyarat yang sebenarnya, Anda dapat menggunakan metode ini.
The
ONBUILD
petunjuk memastikan bahwa file tersebut hanya disalin jika "cabang" dipilih olehBUILD_ENV
. Setel var ini menggunakan skrip kecil sebelum memanggildocker build
sumber
Bekerja di sekitar Solution
Saya memiliki persyaratan untuk menyalin FOLDER ke server berdasarkan Variabel ENV. Saya mengambil gambar server kosong. membuat struktur folder penyebaran yang diperlukan di dalam folder lokal. lalu tambahkan baris di bawah ini ke DockerFile, salin folder ke container. Aku n baris terakhir ditambahkan entry point untuk mengeksekusi file.sh init sebelum buruh pelabuhan mulai server.
Kemudian buat file custom-init.sh di lokal dengan script seperti di bawah ini
Di buruh pelabuhan-menulis file bawah baris.
lingkungan: - BUILD_EVN = TEST
Perubahan ini menyalin folder ke penampung selama pembuatan buruh pelabuhan. ketika kita menjalankan docker-compose , salin atau gunakan folder yang sebenarnya diperlukan ke server sebelum server dimulai.
sumber
Salin semua file ke direktori sekali pakai, pilih yang Anda inginkan, buang sisanya.
Anda dapat mencapai sesuatu yang serupa menggunakan tahapan build, yang bergantung pada solusi yang sama, menggunakan
cp
untuk menyalin secara bersyarat. Dengan menggunakan tahap pembuatan, gambar akhir Anda tidak akan menyertakan semua konten dari awalCOPY
.sumber
cache
dan tergantung apa itu cache saya memilih apa yang harus dilakukan dalam file skrip!Mencoba ide lain, tetapi tidak ada yang memenuhi persyaratan kami. Idenya adalah membuat gambar nginx dasar untuk aplikasi web statis anak. Untuk alasan keamanan, pengoptimalan, dan standarisasi, gambar dasar harus dapat menjalankan
RUN
perintah pada direktori yang ditambahkan oleh gambar anak. Gambar dasar tidak mengontrol direktori mana yang ditambahkan oleh gambar anak. Asumsinya adalah gambar anak akanCOPY
sumber daya di suatu tempat di bawahCOMMON_DEST_ROOT
.Pendekatan ini adalah hack, tetapi idenya adalah gambar dasar akan mendukung
COPY
instruksi untuk direktori 1 ke N yang ditambahkan oleh gambar anak.ARG PLACEHOLDER_FILE
danENV UNPROVIDED_DEST
digunakan untuk memenuhi<src>
dan<dest>
persyaratan untuk setiapCOPY
instruksi yang tidak diperlukan.Solusi ini memiliki kekurangan yang jelas seperti nomor dummy
PLACEHOLDER_FILE
dan kode keras dari instruksi COPY yang didukung. Juga tidak ada cara untuk menghilangkan variabel ENV yang digunakan dalam instruksi COPY.sumber