Cara membuat folder yang disinkronkan muncul sebagai folder normal

38

Saya memiliki dua aplikasi Dart yang harus saya galerisasi. Dua aplikasi ini menggunakan direktori sumber bersama.
Karena Docker mencegah penambahan file dari folder di luar direktori konteks ( project/app1) Saya tidak dapat menambahkan file dari ../sharedatau dari shared(symlink di dalamnya projects/app1).

Saya mencari cara untuk menipu Docker untuk melakukannya.

Struktur proyek saya yang disederhanakan

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

Saya bisa naik Dockerfilesatu tingkat dan berlari docker builddari sana, tetapi kemudian saya membutuhkan dua Dockerfiles (untuk app1 dan app2) di direktori yang sama.

Ide saya saat ini adalah, jika saya bisa menyembunyikan fakta bahwa projects/app1/sharedsymlink masalah ini akan diselesaikan. Saya memeriksa apakah saya dapat berbagi projectsmenggunakan Samba dan remount di tempat lain dan mengkonfigurasi Samba untuk memperlakukan symlink seperti folder normal tetapi belum menemukan apakah ini didukung (Saya belum punya banyak pengalaman dengan Samba dan belum mencobanya, hanya mencari sedikit) .

Apakah ada alat atau trik lain yang memungkinkan?

Saya lebih suka tidak mengubah struktur direktori karena ini akan menyebabkan masalah lain dan juga lebih suka tidak menyalin file di sekitar.

zoechi
sumber

Jawaban:

35

Saya tidak punya banyak pengalaman dockerjadi saya tidak bisa menjanjikan ini akan berhasil, tetapi satu pilihan adalah memasang direktori daripada menautkannya:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

Yang akan melampirkan ../shareduntuk ./shareddan harus benar-benar transparan ke sistem. Sebagaimana dijelaskan dalam man mount:

Bind mount.

Sejak Linux 2.4.0 dimungkinkan untuk me-remount bagian dari hirarki file di tempat lain. Panggilannya adalah:

mount --bind olddir newdir

atau dengan menggunakan entri fstab ini:

/olddir /newdir none bind

Setelah panggilan ini, konten yang sama dapat diakses di dua tempat.

terdon
sumber
1
@zoechi ini sempurna pada topik di kedua situs. Sebagai aturan umum, saya akan memposting lebih banyak pertanyaan teknis seperti ini di U&L dan lebih banyak pertanyaan ruang pengguna di sini. Pilihannya sepenuhnya terserah Anda. Di satu sisi, ada lebih banyak pengguna di sini sehingga lebih banyak bola mata, di sisi lain, ada konsentrasi yang jauh lebih tinggi dari orang-orang profesional di U&L. Pastikan Anda tidak memposting pertanyaan yang sama di kedua situs. Jika Anda ingin memindahkannya, hapus ini atau beri tanda untuk mod mod dan minta mereka untuk bermigrasi.
terdon
2
Itu wajib bagi saya untuk me-restart daemon buruh pelabuhan! Lain dir yang dipasang tidak terlihat dalam wadah.
redup
@ ya ya! Saya mencoba membuatnya bekerja dengan Capistrano dan tidak berhasil - ternyata saya memasang direktori bersama setelah saya mulai wadah
csch
Sayangnya ini tidak akan berfungsi untuk pengguna Windows atau OS X. Perdebatan tentang masalah ini telah ... hidup.
Jason
Apakah pemasangan 'berkomitmen' ke kontrol sumber misalnya github? atau haruskah saya melakukannya setiap waktu?
pie6k
23

Masalah ini telah berulang kali muncul di komunitas Docker. Ini pada dasarnya melanggar persyaratan bahwa Dockerfiledapat diulang jika Anda menjalankannya atau saya menjalankannya. Jadi saya tidak akan mengharapkan kemampuan ini, seperti yang dijelaskan dalam tiket ini: Perintah Dockerfile ADD tidak mengikuti symlink pada host # 1676 .

Jadi, Anda harus memikirkan pendekatan yang berbeda. Jika Anda melihat masalah ini: ADD untuk mendukung symlink dalam argumen # 6094 , seorang teman kami dari U&L ( @Patrick aka. Phemmer) memberikan solusi yang cerdas.

$ tar -czh . | docker build -

Ini memberitahu tardereference tautan simbolik dari direktori saat ini, dan kemudian pipa semuanya ke docker build -perintah.

kutipan dari halaman manual tar
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip
slm
sumber
3
Ini adalah solusi yang SANGAT BAIK! Saya mengerti mengapa Docker mengklaim mereka ingin menghilangkan fitur ini. Namun, ada perbedaan besar dalam alur kerja yang saya gunakan saat mengembangkan proyek kemasukan dan bagaimana saya mengharapkannya dibangun untuk produksi. Di mesin lokal saya, saya ingin umpan balik yang sangat ketat. Aplikasi saya memiliki repo 1 git dan lingkungan build untuk container memiliki repo ke-2. Saya harus dapat melakukan pengeditan dan membuat tes secara lokal sebelum saya dapat memutuskan apakah saya ingin berkomitmen dan mendorong. Saya tidak akan memiliki symlink atau instruksi ADD di tugas akhir saya.
Bruno Bronosky
6
File Docker tidak dapat diulang. Dockerfiles tidak dapat dibuat berulang, karena mereka hampir semuanya memiliki apt-get atau sesuatu yang setara pada layer ke-2 atau ke-3 dan apt-get tidak dapat diulang. Mengaitkan strategi pengembangan Docker dengan upaya sesat untuk membuat yang tidak mungkin menjadi benar hanya akan membebani Docker dengan serangkaian abstraksi buruk yang tidak membantu siapa pun. nathanleclaire.com/blog/2014/09/29/…
Jason
1
Ok, jadi saya tidak benar-benar mengerti mengapa ini lebih baik daripada cpperintah, dapatkah Anda menjelaskan mengapa ini lebih baik? Saya juga berpikir pipa itu membingungkan / terlalu berbelit-belit. Mengapa tidak meletakkan perintah tar di atas perintah build. Saya kira karena Anda akan menimpa direktori yang disinkronkan dengan direktori yang sebenarnya.
Alexander Mills
1
@AlexanderMills - cara terbaik untuk melihat apa yang terjadi adalah dengan mencobanya dan melihat perbedaannya. Juga di atas adalah bangunan wadah tidak berjalan, jadi tidak ada pemasangan. stackoverflow.com/questions/37328370/… . Saya sangat menyarankan Anda mencoba semua hal ini, itu akan jauh lebih masuk akal.
slm
1
Saya baru saja menambahkan /bin/cp ../requirements.txt . && docker build ...ke Makefile untuk membangun Docker, itu lebih mudah
user5359531