Birimleri kullanarak dockerized postgres veritabanındaki veriler nasıl devam ettirilir


207

Docker oluşturma dosyamda üç kapsayıcı var: web, nginx ve postgres. Postgres şöyle görünür:

postgres:
  container_name: postgres
  restart: always
  image: postgres:latest
  volumes:
    - ./database:/var/lib/postgresql
  ports:
    - "5432:5432

Amacım ./databasepostgres kapsayıcısı olarak adlandırılan yerel bir klasöre karşılık gelen bir birim bağlamaktır /var/lib/postgres. Bu kapsayıcıları başlattığımda ve postgres'e veri eklediğimde, eklediğim verilerle /var/lib/postgres/data/base/(postgres kapsayıcısında) dolu olduğunu doğruladım , ancak yerel sistemimde ./databasesadece bir dataklasör var, yani ./database/dataoluşturuldu, ancak boş . Neden?

Notlar:

GÜNCELLEME 1

Nick'in önerisine göre, yaptım docker inspectve buldum:

    "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": ""
        }
    ],

Bu da veriyi kendim kodlamadığım başka bir cilt tarafından çalınıyor gibi görünüyor. Neden böyle emin değilim. Postgres görüntüsü benim için bu birimi oluşturuyor mu? Öyleyse, yeniden başlattığımda monte ettiğim birim yerine bu birimi kullanmanın bir yolu var mı? Aksi takdirde, diğer cildi devre dışı bırakmanın ve kendiminkini kullanmanın iyi bir yolu var ./databasemı?

GÜNCELLEME 2

Çözümü buldum, Nick sayesinde! (ve başka bir arkadaş) Aşağıdaki cevap.


initdbveritabanı kümenizi başlatmak için komut satırını zaten çalıştırıyor musunuz?
Sebastian Webber

Veri alt dizininizin gerçekten boş olduğundan emin misiniz? Özel erişim izinleri olabilir.
Yaroslav Stavnichiy

Bana bu kadar hızlı döndüğün için teşekkürler! Ben bir şişe uygulaması kullanıyorum, bu yüzden ben from app import dbve db.create_all()bir docker runkonteyner başladıktan sonra. Bilmiyorum initdbkomut satırından doğrudan.
Alex Lenail

1
@YaroslavStavnichiy Bunu kontrol etmek sudo su -ve içine bakmak için başka nasıl bilmiyorum ./database/data. Orada söyleyebildiğim kadarıyla hiçbir şey yok.
Alex Lenail

Birisi bunu yararlı bulabilir: örnek oluşturma dosyası kalıcı postgres, elastik arama ve medya verileri, stackoverflow.com/a/56475980/5180118
ArdentLearner

Yanıtlar:


259

Garip bir şekilde, çözüm değişti

volumes:
  - ./postgres-data:/var/lib/postgresql

için

volumes:
  - ./postgres-data:/var/lib/postgresql/data

46
Bu yanıt için hızlı bir "neden" (işe yarıyor). Postgres millet başına, varsayılan veri dizini /var/lib/postgresql/data- burada PGDATA değişken notlarını okuyabilirsiniz: store.docker.com/images/…
Matt Pavelle

2
Yukarıdaki soruda, OP sonunda / data olmadan onun için çalıştığını söylüyor. Bu doğru mu?
Sid

2
Ve yerel dizini .dockerignoredosyanıza ekleyin , özellikle de bunu bir üretim görüntüsüne çekerseniz. Tartışma için codefresh.io/blog/not-ignore-dockerignore sayfasına bakın .
dsz

4
bu hala benim için çalışmıyor (mac os x high sierra)
Olidem

1
@ OlliD-Metz Çalışmadan docker rm my_postgres_container_1önce yapmam gerekiyordu (ayrıca High Sierra).
zengin

103

Tüm Postgres verileri için ortak bir birim oluşturabilirsiniz

 docker volume create pgdata

veya oluşturma dosyasına ayarlayabilirsiniz

   version: "3"
   services:
     db:
       image: postgres
       environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgress
         - POSTGRES_DB=postgres
       ports:
         - "5433:5432"
       volumes:
         - pgdata:/var/lib/postgresql/data
       networks:
         - suruse
   volumes: 
     pgdata:

Birim adı pgdata oluşturur ve bu birimi kapsayıcı yoluna bağlar .

Bu cildi inceleyebilirsiniz

docker volume inspect pgdata

// output will be
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]

8
Biraz geç yorum yapmak, ama yaparsam bu net veri olmaz docker-compose down -v. Ve bunun çözümü nedir?
Sid

3
@Sid, evet, olacak! Sadece bu seçeneğe dikkat edin.
olidem

1
docker-compose [down] ile hacim artık kalıcı değil mi? Birimde bile tam temizlik var mı?
Paul

2
Hatta daha sonra yorumlarında @Sid ama olabilir kullanmak docker-compose down --rmi all olmadan-v seçeneği ve "her şey" temizlemek edeceğiz hariç hacimleri, yani kaplar, ağlar, resimler vb yapmam veri kalıcılığını izin verirken dağıtırken söyledi.
code_dredd

13

Göreli bir yol kullanmaktan kaçınırım. Docker'ın bir daemon / istemci ilişkisi olduğunu unutmayın.

Oluşturma işlemini yürütürken, aslında çeşitli docker istemci komutlarına ayrılır ve bunlar daha sonra arka plan programına aktarılır. Bu ./databasedaha sonra istemciye değil, arka plana görecelidir .

Şimdi, docker dev ekibinin bu konuda ileri geri bazı şeyler var , ancak sonuçta beklenmedik sonuçlar doğurabilir.

Kısacası, göreli bir yol kullanmayın, mutlak bir yol kullanın.


Bu cevap için teşekkürler! Ne yazık ki, işe yaradığını sanmıyorum. Çizgiyi mutlak bir yola değiştirdim ve verileri database/data
ekledikten

K. Bir sonraki adım docker inspectkabın üzerinde koşmak ve kabın hacimden haberdar olduğundan emin olmaktır (beste karıştırıldığında veya başka bir şey olması durumunda). (not: genellikle bir hata gösterebilir olsa da liman işçisi böylece Bundan sonra ;-) munging olmadan buraya yapıştırın yok, hassas verileri olabilir incelemek, bu) (kontrol izinler meselesi
Nick Burke

Aha! @Nick Burke Sanırım bir şey buldun. Soruyu güncelledim.
Alex Lenail

2

Bence sadece önce bir ile docker dışında birim oluşturmak docker create -v /location --nameve sonra yeniden kullanmak gerekir.

Docker'ı çok kullandığım zaman, dockerfile tanımına sahip statik bir docker birimi kullanmak mümkün değildi, bu yüzden önerim komut satırını (sonunda bir komut dosyasıyla) denemektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.