sql >> Database teknologi >  >> RDS >> PostgreSQL

Docker-volumen bevarer ikke data

Der er noget, der forvirrede mig og for mig ikke var særlig tydeligt i den officielle dokumentation.

Mig bekendt kan vedvarende mængder oprettes i tre måder.

  • På container-påkaldelsestidspunktet inklusive fuld sti ( -v ~/database:/data ):gør en ekstern mappe fra værten tilgængelig inde i docker-beholderen. Begge kan ændre det.
  • På container-påkaldelsestidspunktet ved hjælp af et volumennavn ( -v datamysql:/data ):gør et volumen, der er vedvarende tilgængeligt inde i beholderen. Det er skabt det, hvis det ikke eksisterede. Du kan liste dem efter navn med docker volume ls . Internt vil det blive gemt på et sted såsom /var/lib/docker/volumes/ae4445f7c9317a22fe84726fb894c47754f38a7fd150c00fd877024889968750/_data .
  • Ved container byggetid ( VOLUME ["/database/data"] i Dockerfile). Hver påkaldelse af docker run vil oprette en ny volumen, der vil bestå, selvom du sletter beholderen. Dette kan være forvirrende, fordi efterfølgende påkald vil resultere i anderledes mængder, der oprettes, som ikke vil blive genbrugt.

Du kan angive både navngivne (andet tilfælde) og unavngivne (tredje tilfælde) bind med

$ docker volume ls                                                             
DRIVER              VOLUME NAME                                                             
local               064593b3e65977097d4d0c8402a6c633f1af69be2937bf118678ab8f97ee9a7e               
local               4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f           
local               8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415               
local               db48eefe8f189b36107ca9c4eebb792690590ab0ba055e7e4e2c9adfd1765b7e                    
local               datamysql

Du kan se den nøjagtige placering af en containers volumen ved at bruge docker inspect mycontainer

{
                "Type": "volume",
                "Name": "8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415",
                "Source": "/media/USBdrive/docker/volumes/8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },

Det kan være praktisk at fjerne ubrugte mængder (specielt i det tredje tilfælde).

$ docker volume prune
WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f

Total reclaimed space: 205MB

Fordi du brugte VOLUME direktiv i din Dockerfile, er du i det tredje tilfælde. Undersøg din container for at lede efter filen, og angiv volumen fra kommandolinjen, hvis du ønsker, at gentagne sessioner skal bevare data.



  1. postgreSQL ændre kolonnedatatype til tidsstempel uden tidszone

  2. SQL Server-kodesider og samlinger

  3. Polymorfisk-lignende SQL-databasetabelstruktur

  4. Opdater MySQL fra CSV ved hjælp af JAVA