Docker mengikuti symlink di luar konteks

93

Namun pertanyaan symlink Docker lainnya. Saya memiliki banyak file yang ingin saya salin ke semua build Docker saya. Struktur dir saya adalah:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

Dalam contoh di atas, saya ingin file.txt disalin ketika saya membangun pelabuhan di dalam dir1. Tetapi saya tidak ingin menyimpan banyak salinan file.txt. Per tautan ini, mulai buruh pelabuhan versi 0.10 , pembuatan buruh pelabuhan harus

Ikuti symlink di dalam root penampung untuk ADD instruksi build.

Tetapi saya tidak mendapatkan file atau direktori seperti itu ketika saya membangun dengan salah satu dari baris ini di Dockerfile saya:

ADD symlink /path/dirname atau ADD symlink/file.txt /path/file.txt

opsi mount TIDAK akan menyelesaikannya untuk saya (lintas platform ...). Saya mencobatar -czh . | docker build -t tanpa hasil.

Apakah ada cara untuk membuat Docker mengikuti symlink dan menyalin common_files / file.txt ke dalam container yang dibangun?

Ravi
sumber

Jawaban:

70

Itu tidak mungkin dan tidak akan dilaksanakan. Silakan lihat diskusi tentang github issue # 1676 :

Kami tidak mengizinkan ini karena tidak dapat diulang. Symlink pada mesin Anda tidak sama dengan mesin saya dan Dockerfile yang sama akan menghasilkan dua hasil yang berbeda. Juga memiliki symlink ke / etc / paasswd akan menyebabkan masalah karena itu akan menautkan file host dan bukan file lokal Anda.

0x7d7b
sumber
Terima kasih. Ya, saya memperhatikan tautan itu sebelumnya tetapi saya pikir itu untuk versi docker yang jauh lebih lama (0.6.1). Log perubahan 0.10 semacam menyebutkan hal ini dimungkinkan github.com/docker/docker/blob/master/…
Ravi
Juga jika "parent_dir" di-check out di komputer manapun dan jika symlink memiliki path relatif ke "common_files", itu akan dapat diulang.
Ravi
2
Kutipan Anda Follow symlinks inside container's root for ADD build instructions.berarti bahwa di dalam wadah symlink diikuti. Tidak dalam direktori konteks build. Di ADD file.txt /dir/file.txtdirektori dirbisa jadi symlink. Argumen yang saya kutip dalam jawaban saya masih valid dan symlink masih tidak diikuti di versi terbaru. Anda mungkin mengalami masalah (terkait pengulangan) saat menyimpan symlink di sistem kontrol revisi seperti git . Oleh karena itu silakan merujuk ke pertanyaan ini .
0x7d7b
1
Saya mengerti maksud Anda tentang symlink di git. Tetapi symlink tidak harus pergi ke git. Skrip penyiapan sederhana dapat mempersiapkan env lokal untuk membuat symlink. Bagi saya, biaya menyimpan salinan 'n' dari file bersama tampak terlalu tinggi dari sudut pandang pemeliharaan. Mungkin saya harus menyajikannya keluar dari Apache. Terima kasih.
Ravi
21
sungguh memalukan, sementara saya melihat intinya saya tidak mengikuti logika dan itu menggigit saya. Git menangani symblink dengan sempurna, dan saya juga berharap build dapat berfungsi di semua mesin dan lingkungan di mana repo sumber diperiksa ..?!
Gregor
9

Salah satu kemungkinannya adalah menjalankan build di direktori induk, dengan:

$ docker build [tags...] -f dir1/Dockerfile .

(Atau dengan kata lain, di direktori anak,)

$ docker build  [tags...] -f Dockerfile ..

Dockerfile harus dikonfigurasi untuk melakukan copy / add dengan path yang sesuai. Bergantung pada penyiapan Anda, Anda mungkin ingin .dockerignoredi orang tua membiarkan hal-hal yang tidak ingin Anda masukkan ke dalam konteks.

shaunc
sumber
8

Jika ada yang masih memiliki masalah ini, saya menemukan solusi yang sangat bagus di superuser.com:

/superuser/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

Ini pada dasarnya menyarankan penggunaan tar untuk mendereferensi symlink dan memasukkan hasilnya ke dalam build buruh pelabuhan:

$ tar -czh . | docker build -
jdabrowski
sumber
Saya mendapatkan 2 kesalahan: tar: Failed to clean up compressor,Error response from daemon: the Dockerfile (Dockerfile) cannot be empty
Ivan Rubinson
3

alih-alih menggunakan simlinks, dimungkinkan untuk menyelesaikan masalah secara administratif dengan hanya memindahkan file dari sites_available ke sites_enabled alih-alih menyalin atau membuat simlinks

jadi konfigurasi situs Anda hanya akan ada dalam satu salinan di folder site_available jika dihentikan atau sesuatu atau di sites_enabled jika harus digunakan

Ilya Kolesnikov
sumber
1

Saya tahu bahwa itu merusak portabilitas pembuatan buruh pelabuhan, tetapi Anda dapat menggunakan tautan keras alih-alih simbolik:

ln /some/file ./hardlink
Eugene
sumber
4
Agar jelas, ini berfungsi untuk file, bukan direktori.
GDorn