Saya mencoba membuat aplikasi php. Di dockerfile saya mengunduh arsip, mengekstraknya dll.
Semuanya berfungsi dengan baik, namun jika versi baru dirilis, dan saya memperbarui dockerfile saya harus menginstal ulang aplikasi, karena config.php akan ditimpa.
Jadi saya pikir saya bisa me-mount file sebagai volume, seperti yang saya lakukan dengan database.
Saya mencobanya dua cara, dengan volume dan jalur langsung.
komposisi buruh pelabuhan:
version: '2'
services:
app:
build: src
ports:
- "8080:80"
depends_on:
- mysql
volumes:
- app-conf:/var/www/html/upload
- app-conf:/var/www/html/config.php
environment:
DB_TYPE: mysql
DB_MANAGER: MysqlManager
mysql:
image: mysql:5.6
container_name: mysql
volumes:
- mysqldata:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE:
MYSQL_USER:
MYSQL_PASSWORD:
volumes:
mysqldata:
app-conf:
Yang menghasilkan kesalahan:
Dan saya mencobanya dengan jalur yang diberikan, sebagai volume yang dipasang.
/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php
Namun kedua cara tersebut tidak berfungsi. Dengan volume yang dipasang saya melihat bahwa unggahan dibuat.
Tetapi kemudian gagal dengan
/var/www/html/config.php \\ "menyebabkan \\" bukan direktori \\ "\" "
Jika saya mencobanya
/src/docker/myapp/upload/config.php:/var/www/html/config.php
Docker membuat folder unggah dan kemudian folder config.php. Bukan file.
Atau adakah cara lain untuk mempertahankan konfigurasi?
sumber
Jawaban:
Volume file dilakukan dengan cara ini di buruh pelabuhan (contoh jalur absolut (dapat menggunakan variabel env), dan Anda perlu menyebutkan nama file):
Anda juga dapat melakukan:
Jika Anda memecat docker-compose dari
/src/docker/myapp
foldersumber
Saya telah menderita masalah yang sama. Saya mencoba mengimpor file konfigurasi saya ke wadah saya sehingga saya dapat memperbaikinya setiap kali saya perlu tanpa membangun kembali gambar.
Maksud saya, saya pikir perintah di bawah ini akan memetakan
$(pwd)/config.py
dari host Docker/root/app/config.py
ke wadah sebagai file.Namun, itu selalu membuat direktori bernama
config.py
, bukan file.sambil mencari petunjuk, saya menemukan alasannya (dari sini )
Oleh karena itu, selalu dibuat sebagai direktori karena host buruh pelabuhan saya tidak punya
$(pwd)/config.py
.Bahkan jika saya membuat config.py di host buruh pelabuhan.
$(pwd)/config.py
hanya overwirte/root/app/config.py
tidak mengekspor/root/app/config.py
.sumber
touch path/to/file
diDockerfile
sehingga ketika saya me-mount itu masih akan menjadi file (bukan dir dibuat):
harus jalur penuh. Ini bekerja dengan cara initouch
adalah jawabannya, melakukan itu di Dockerfile kemudian Volume buruh pelabuhan-compose Anda me-mount akan bekerja dengan benar tanpa membuat direktoriGunakan mount (
--mount
) sebagai gantinya volume (-v
)Info lebih lanjut: https://docs.docker.com/storage/bind-mounts/
Contoh:
Pastikan /tmp/a.txt ada di host buruh pelabuhan
sumber
--mount
dan-v
adalah perilaku ketika bagian host dari volume belum ada. Sesuai tautan Anda:> Jika Anda menggunakan -v atau --volume untuk mengikat-mount file atau direktori yang belum ada pada host Docker, -v menciptakan titik akhir untuk Anda. Itu selalu dibuat sebagai direktori.Bagi siapa pun yang menggunakan wadah Windows seperti saya, ketahuilah bahwa Anda TIDAK BISA mengikat atau memasang file tunggal menggunakan wadah Windows.
Sulit dikenali tapi ada di sana
Tautan ke masalah Github tentang pemetaan file ke dalam wadah Windows
sumber
Cara yang bekerja untuk saya adalah dengan menggunakan
bind
mountTerima kasih mike mengembang atas jawaban di: Pasang file tunggal dari volume menggunakan docker-compose
Anda perlu menggunakan "sintaks panjang" untuk mengekspresikan
bind
mount: https://docs.docker.com/compose/compose-file/#long-syntaxsumber
Pada file docker-compose versi 3.2 Anda dapat menentukan volume mount tipe "bind" (bukan tipe default "volume") yang memungkinkan Anda untuk memasang satu file ke dalam wadah. Cari "bind mount" di dok volume-buat dokumen volume: https://docs.docker.com/compose/compose-file/#volumes
Dalam kasus saya, saya mencoba me-mount satu file "rahasia." Ke dalam aplikasi saya yang berisi rahasia untuk pengembangan dan pengujian lokal saja. Dalam produksi, aplikasi saya mengambil rahasia ini dari AWS sebagai gantinya.
Jika saya memasang file ini sebagai volume menggunakan sintaks singkatan:
Docker akan membuat direktori ".secrets" di dalam wadah alih-alih memetakan ke file di luar wadah. Kode saya kemudian akan memunculkan kesalahan seperti "IsADirectoryError: [Errno 21] Adalah direktori: '.secrets'".
Saya memperbaikinya dengan menggunakan sintaks tangan lama sebagai gantinya, menentukan file rahasia saya menggunakan mount mount read-only "bind":
Sekarang Docker dengan benar me-mount file .secrets saya ke dalam wadah, membuat file di dalam wadah bukan direktori. Semoga orang lain menemukan contoh ini bermanfaat!
sumber
Anda juga dapat menggunakan jalur relatif ke
docker-compose.yml
file Anda seperti ini (diuji pada host Windows, wadah Linux):sumber
version: '3.7'
ditentukan dalamdocker-compose.yml
file dengan docker-compose versi 1.24.1, build 4667896b, dan itu berhasil.Bagi saya, masalahnya adalah saya memiliki tautan simbolis yang rusak pada file yang saya coba pasang ke wadah
sumber
Saya memiliki masalah yang sama pada Windows
Docker 18.06.1-ce-win73 (19507)
,.Menghapus dan menambahkan kembali drive bersama melalui panel pengaturan Docker dan semuanya berfungsi kembali.
sumber
Di windows, jika Anda memerlukan variabel env $ {PWD} di docker-compose.yml, Anda dapat membuat file .env di direktori yang sama dengan file docker-compose.yml lalu memasukkan secara manual lokasi folder Anda.
CMD (pwd_var.bat):
Powershell (pwd_var.ps1):
Ada fitur yang lebih baik untuk mendengar variabel .env docker-compose: https://docs.docker.com/compose/reference/envvars/ terutama untuk
COMPOSE_CONVERT_WINDOWS_PATHS
variabel env yang memungkinkan buruh pelabuhan menulis untuk menerima jalur windows dengan baskslash"\"
.Saat Anda ingin membagikan file di windows, file tersebut harus ada sebelum membaginya dengan kontainer.
sumber
Mungkin ini membantu seseorang.
Saya memiliki masalah ini dan mencoba segalanya. Binding Volume terlihat baik dan bahkan jika saya memasang direktori (bukan file), saya memiliki nama file di direktori yang terpasang dengan benar tetapi dipasang sebagai dirs.
Saya mencoba mengaktifkan kembali drive yang dipakai bersama dan Docker mengeluh firewallnya aktif.
Setelah menonaktifkan firewall semua bekerja dengan baik.
sumber
Anda dapat memasang file atau direktori / folder itu semua tergantung pada file Sumber atau direktori. Dan juga Anda perlu memberikan path lengkap atau jika Anda tidak yakin Anda dapat menggunakan PWD. Ini adalah contoh kerja sederhana.
Dalam contoh ini, saya sedang memasang file env-commands yang sudah ada di direktori kerja saya
sumber
Saya memiliki masalah yang sama pada Windows 8.1 saya
Ternyata itu karena sensitivitas case path. Saya menelepon
docker-compose up
dari direktoricd /c/users/alex/
dan di dalam wadah file diubah menjadi direktori.Tetapi ketika saya melakukannya
cd /c/Users/alex/
(bukan Pengguna dengan huruf besar) dan menelepondocker-compose up
dari sana, itu berhasil.Dalam sistem saya, dir Pengguna dan dir Alex dikapitalisasi, meskipun sepertinya hanya dir Pengguna.
sumber