File penulisan docker saya memiliki tiga kontainer, web, nginx, dan postgres. Postgres terlihat seperti ini:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
Tujuan saya adalah memasang volume yang sesuai dengan folder lokal yang disebut ./database
di dalam wadah postgres /var/lib/postgres
. Ketika saya mulai wadah ini dan memasukkan data ke postgres, saya memverifikasi bahwa /var/lib/postgres/data/base/
penuh dengan data yang saya tambahkan (dalam wadah postgres), tetapi dalam sistem lokal saya, ./database
hanya mendapat data
folder di dalamnya, yaitu ./database/data
dibuat, tetapi kosong . Mengapa?
Catatan:
- Ini menyarankan file saya di atas harus berfungsi.
- Orang ini menggunakan layanan buruh pelabuhan yang menarik
PEMBARUAN 1
Atas saran Nick, saya melakukan docker inspect
dan menemukan:
"Mounts": [
{
"Source": "/Users/alex/Documents/MyApp/database",
"Destination": "/var/lib/postgresql",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
"Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Yang membuatnya tampak seperti data sedang dicuri oleh volume lain saya tidak kode sendiri. Tidak yakin kenapa seperti itu. Apakah gambar postgres membuat volume itu untuk saya? Jika demikian, apakah ada cara untuk menggunakan volume itu alih-alih volume yang saya pasang saat memulai ulang? Jika tidak, apakah ada cara yang baik untuk menonaktifkan volume lain itu dan menggunakan volume saya sendiri ./database
?
PEMBARUAN 2
Saya menemukan solusinya, terima kasih kepada Nick! (dan teman lain) Jawab di bawah.
sumber
initdb
baris perintah untuk menginisialisasi cluster database Anda?from app import db
dandb.create_all()
daridocker run
setelah memulai wadah. Saya tidakinitdb
langsung dari baris perintah.sudo su -
dan melihat ke dalam./database/data
. Tidak ada apa-apa di sana sejauh yang saya tahu.Jawaban:
Anehnya, solusinya akhirnya berubah
untuk
sumber
/var/lib/postgresql/data
- Anda dapat membaca catatan variabel PGDATA di sini: store.docker.com/images/….dockerignore
file Anda , terutama jika Anda akan memangkas ini menjadi gambar produksi. Lihat codefresh.io/blog/not-ignore-dockerignore untuk diskusi.docker rm my_postgres_container_1
sebelum berhasil (juga High Sierra).Anda dapat membuat volume umum untuk semua data Postgres
atau Anda dapat mengaturnya ke file penulisan
Ini akan membuat pgdata nama volume dan me-mount volume ini ke jalur penampung.
Anda dapat memeriksa volume ini
sumber
docker-compose down -v
. Dan apa solusinya?docker-compose down --rmi all
tanpa yang-v
pilihan dan itu akan membersihkan "segala sesuatu" kecuali volume, yaitu kontainer, jaringan, gambar, dll saya melakukan itu ketika deploying sementara memungkinkan data ketekunan.Saya akan menghindari menggunakan jalur relatif. Ingatlah bahwa buruh pelabuhan adalah hubungan daemon / klien.
Ketika Anda menjalankan penulisan, itu pada dasarnya hanya memecah menjadi berbagai perintah klien buruh pelabuhan, yang kemudian diteruskan ke daemon. Itu
./database
kemudian relatif terhadap daemon , bukan klien.Sekarang, tim pengembang buruh pelabuhan memiliki beberapa bolak-balik tentang masalah ini , tetapi intinya adalah ia dapat memiliki beberapa hasil yang tidak terduga.
Singkatnya, jangan gunakan jalur relatif, gunakan jalur absolut.
sumber
database/data
folder tersebut masih kosong = (docker inspect
pada wadah dan memastikan bahwa wadah mengetahui volume (kalau-kalau menulis bingung atau sesuatu). (catatan: buruh pelabuhan dapat memiliki data sensitif, jadi jangan tempel di sini tanpa munging ;-) Setelah itu, masalah memeriksa izin (meskipun itu biasanya akan menunjukkan kesalahan)Saya pikir Anda hanya perlu membuat volume Anda di luar buruh pelabuhan pertama dengan
docker create -v /location --name
dan kemudian menggunakannya kembali.Dan pada saat saya sering menggunakan buruh pelabuhan, itu tidak mungkin untuk menggunakan volume buruh pelabuhan statis dengan definisi dockerfile jadi saran saya adalah untuk mencoba baris perintah (akhirnya dengan skrip).
sumber